Panda学习笔记
panda简介
基本数据类型
Series
Series
是带标签的一维数组,可存储整数、浮点数、字符串、Python 对象等类型的数据。轴标签统称为索引。调用 pd.Series
函数即可创建 Series:
import pandas as pd
import numpy as np
import matplotlib as plt
s0
s0=pd.Series(np.random.randn(5),index=['a','b','c','d','e'])
print(s0)
a -0.139644
b -1.202701
c 1.199897
d -0.106429
e -1.464700
dtype: float64
data
支持以下数据类型:Python 字典、多维数组、标量值。
可用字典直接创建Series
d = {'b': 1, 'a': 0, 'c': 2}
pd.Series(d)
DataFrame
DataFrame 是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的字典。DataFrame 是最常用的 Pandas 对象,与 Series 一样,DataFrame 支持多种类型的输入数据:
- 一维 ndarray、列表、字典、Series 字典
- 二维 numpy.ndarray
s0=pd.Series(np.random.randn(5),index=['a','b','c','d','e'])
d = {'b': 1, 'a': 0, 'c': 2}
s1=pd.Series(d)
D={'one':s0,'two':s1}
pd.DataFrame(D)
one two
a -0.759546 0.0
b 0.257484 1.0
c -0.371518 2.0
d -1.422805 NaN
e -1.169984 NaN
pd.DataFrame(D, index=['d', 'b', 'a'], columns=['one', 'two'])
one two
d -1.422805 NaN
b 0.257484 1.0
a -0.759546 0.0
data = np.zeros((2, ), dtype=[('A', 'i4'), ('B', 'f4'), ('C', 'a10')])
print(data)
data[:] = [(1, 2., 'Hello'), (2, 3., "World")]
[(0, 0., b'') (0, 0., b'')]
pd.DataFrame(data)
A B C
0 1 2.0 b'Hello'
1 2 3.0 b'World'
多种方式创建
df2 = pd.DataFrame({'A': 1.,
'B': pd.Timestamp('20130102'),
'C': pd.Series(1, index=list(range(4)), dtype='float32'),
'D': np.array([3] * 4, dtype='int32'),
'E': pd.Categorical(["test", "train", "test", "train"]),
'F': 'foo'})
df2
A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo
2 1.0 2013-01-02 1.0 3 test foo
3 1.0 2013-01-02 1.0 3 train foo
提取、添加、删除行(列)
DataFrame 就像带索引的 Series 字典,提取、设置、删除列的操作与字典类似:
索引
data=[{'b': 1, 'a': 0, 'c': 2},{'b': 4, 'a': 7, 'c': 9}]
pddata=pd.DataFrame(data,index=['one','two'])
pddata
b a c
one 1 0 2
two 4 7 9
#索引
pddata['a']
pddata[0:2]
pddata['one':'two']['a']
one 0
two 7
Name: a, dtype: int64
b a c
one 1 0 2
two 4 7 9
one 0
two 7
Name: a, dtype: int64
#按列索引
pddata['a']
pddata[0:2]
pddata['one':'two']['a']
#按照行索引
df2.loc[0]
pddata.loc['one':'two']
#选择列
df2['A']
df2[['A','B']]
#混合索引
df2.loc[:, ['A', 'B']]
#按轴索引
df2.iloc[3:5, 0:2]
#条件索引,可以多条件索引
df2[df2.E =='test']
追加
#追加行
s=pd.Series({'A': 1.,
'B': pd.Timestamp('20130102'),
'C': 1.0,
'D': 3,
'E': "test",
'F': 'foo'})
df2.append(s, ignore_index=True)
#追加列
df2.insert(1,'G',df2['A'])
#对于标量值,可以以广播形式追加
df2['H']='yes'
df2
删除
关于删除,这里有个帖子记录得比较全面:pandas删除
统计运算
分组
在pandas中提供了一个非常好的分组功能,能够将整个df按照某列的信息进行分组:分组
对于此df,可按照标签E的分类来进行分组:
A B C D E F
0 1.0 2013-01-02 2.0 0 test foo
1 1.0 2013-01-02 2.0 1 train foo
2 1.0 2013-01-02 2.0 2 ? foo
3 1.0 2013-01-02 2.0 3 train foo
#分组
data=origin_data.copy()
group_data=data.groupby(['E'])
#获取分组
print(group_data.get_group('train'))
#也可以直接获取统计量
group_data.sum()
group_data.count()
A B C D E F
1 1.0 2013-01-02 2.0 1 train foo
3 1.0 2013-01-02 2.0 3 train foo
A B C D F
E
? 1 1 1 1 1
test 1 1 1 1 1
train 2 2 2 2 2
异常值处理
字符串
在处理数据的过程中,难免需要对字符串进行处理,去除一些冗余信息,提取关键信息。可利用Series内置的str方法:contains,replace等等。
这段数据在cloumns=E的列中包含(注意,这里是包含就可以了,replace是需要全等)了一个?号,这是不希望发生的,一半会进行替换或者删除,首先是要找到它。
origin_data= pd.DataFrame({'A': 1.,
'B': pd.Timestamp('20130102'),
'C': pd.Series(2, index=list(range(4)), dtype='float32'),
'D': np.array([3] * 4, dtype='int32'),
'E': pd.Categorical(["test", "train", "?", "train"]),
'F': 'foo'})
origin_data
A B C D E F
0 1.0 2013-01-02 2.0 3 test foo
1 1.0 2013-01-02 2.0 3 train foo
2 1.0 2013-01-02 2.0 3 ? foo
3 1.0 2013-01-02 2.0 3 train foo
#筛选出中间的?的
#方式1 粗暴的正则表达式法
data=origin_data.copy()
bool=data['E'].str.contains('\?') #这里填正则表达式
bool
index=data['E'][bool].index
data[bool]
#或者是删除这一行
data[~bool]
A B C D E F
0 1.0 2013-01-02 2.0 3 test foo
1 1.0 2013-01-02 2.0 3 train foo
3 1.0 2013-01-02 2.0 3 train foo
或者是对于有些值,我们需要找到感兴趣的,比如包含Mr,包含其余字符串的。就可以用此方法。
空值处理
删除空值,其中对于dataframe,axis=1指的是横轴,与numpy的轴有区别
origin_data = origin_data[~(origin_data.isnull()).any(axis=1)]
筛选
非数字型筛选
origin_data= pd.DataFrame({'A': 1.,
'B': pd.Timestamp('20130102'),
'C': pd.Series(2, index=list(range(4)), dtype='float32'),
'D': np.array([3] * 4, dtype='int32'),
'E': pd.Categorical(["test", "train", "?", "train"]),
'F': 'foo'})
origin_data
#删除?的值
data=origin_data.copy()
data=data.replace('?',np.nan)
data.dropna(how='any',inplace=True)
data
A B C D E F
0 1.0 2013-01-02 2.0 3 test foo
1 1.0 2013-01-02 2.0 3 train foo
3 1.0 2013-01-02 2.0 3 train foo
#筛选出非数字型的columns,这对于继续一些非连续特征的处理非常关键
unumberic_data=set(data.columns) - set(data.describe().columns)
unumberic_data
{'B', 'E', 'F'}
其余类型筛选
#选择某个特别数据类型的列出来
data=origin_data.copy()
data.dtypes
A float64
B datetime64[ns]
C float32
D int32
E category
F object
dtype: object
#选出类型['category','float']
data.select_dtypes(['category','float'])
A E
0 1.0 test
1 1.0 train
2 1.0 ?
3 1.0 train
#选出除了['category','float']以外的类型
data.select_dtypes(exclude=['category','float'])
B C D F
0 2013-01-02 2.0 0 foo
1 2013-01-02 2.0 1 foo
2 2013-01-02 2.0 2 foo
3 2013-01-02 2.0 3 foo