Pandas学习笔记-基础篇
参考资料
https://www.yiibai.com/pandas/
导入模块
import pandas as pd
import numpy as np
Series系列
系列(Series
)是能够保存任何类型的数据(整数,字符串,浮点数,Python对象等)的一维标记数组。轴标签统称为索引
pandas.Series(data, index, dtype, copy)
编号 | 参数 | 描述 |
---|---|---|
1 | data |
数据采取各种形式,如:ndarray ,list ,constants |
2 | index |
索引值必须是唯一的和散列的,与数据的长度相同。 默认np.arange(n) 如果没有索引被传递。 |
3 | dtype |
dtype 用于数据类型。如果没有,将推断数据类型 |
4 | copy |
复制数据,默认为false 。 |
创建
ndarray系列
如果数据是ndarray
,传递的索引必须具有相同长度。
如果没有传递索引值,则默认索引为[0,1,2,...,range(len(array))-1]-1
In[5]: data = np.array(['a','b','c','d'])
In[6]: pd.Series(data) #没有传递索引值
Out[6]:
0 a
1 b
2 c
3 d
dtype: object
In[7]: pd.Series(data,index = ['A','B','C','D']) #自定义索引值
Out[7]:
A a
B b
C c
D d
dtype: object
字典系列
如果没有指定索引,按照排序顺序取得字典键构造索引;
如果传递索引,索引中与标签对应的数据中的值被拉出。
In[12]: data = {'b':1,'a':0,'c':2}
In[13]: data
Out[13]:
{'a': 0, 'b': 1, 'c': 2}
In[14]: pd.Series(data) #键被用于构建索引
Out[14]:
a 0
b 1
c 2
dtype: int64
In[15]: pd.Series(data,index=['b','d','a']) #输出顺序和索引顺序一致,缺少的元素使用NaN补充
Out[15]:
b 1.0
d NaN
a 0.0
dtype: float64
标量系列
从标量创建系列,必须提供索引。
In[20]: pd.Series(5,index=range(0,5))
Out[20]:
0 5
1 5
2 5
3 5
4 5
dtype: int64
访问
根据位置
In[21]: s =pd.Series(5,index=range(0,5))
In[22]: print(s)
0 5
1 5
2 5
3 5
4 5
dtype: int64
In[23]: s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
In[24]: print(s)
a 1
b 2
c 3
d 4
e 5
dtype: int64
In[25]: print(s[0]) #检索第一个元素
1
In[26]: print(s[:3]) #检索前三个元素
a 1
b 2
c 3
dtype: int64
In[28]: print(s[-3:]) #检索后三个元素
c 3
d 4
e 5
dtype: int64
根据标签
In[31]: s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
In[32]: print(s)
a 1
b 2
c 3
d 4
e 5
dtype: int64
In[33]: print(s['a']) #检索单个索引
1
In[34]: print(s[['a','c','d']]) #检索多个索引
a 1
c 3
d 4
dtype: int64
Dataframe数据框
pandas.DataFrame(data,index,columns,dtype,copy)
编号 | 参数 | 描述 |
---|---|---|
1 | data |
数据采取各种形式,如:ndarray ,series ,map ,lists ,dict ,constant 和另一个DataFrame 。 |
2 | index |
对于行标签,要用于结果帧的索引是可选缺省值np.arrange(n) ,如果没有传递索引值。 |
3 | columns |
对于列标签,可选的默认语法是 - np.arange(n) 。 这只有在没有索引传递的情况下才是这样。 |
4 | dtype |
每列的数据类型。 |
5 | copy |
如果默认值为False ,则此命令(或任何它)用于复制数据。 |
创建
从列表创建
In[41]: data=[1,2,3,4,5] #单个列表
In[42]: df=pd.DataFrame(data)
In[43]: print(df)
0
0 1
1 2
2 3
3 4
4 5
In[44]: data=[['Alex',10],['Bob',12],['Clarke',13]] #多维列表
In[46]: df=pd.DataFrame(data,columns=['Name','Age'])
In[47]: print(df)
Name Age
0 Alex 10
1 Bob 12
2 Clarke 13
In[48]: df=pd.DataFrame(data,columns=['Name','Age'],dtype=float) #更改数据类型
In[49]: print(df)
Name Age
0 Alex 10.0
1 Bob 12.0
2 Clarke 13.0
从ndarray/Lists创建
所有ndarray
必须具有相同长度,如果传递了index
,则索引长度应该等于数组长度
In[52]: data = {'Name':['Tom','Jack','Steve','Ricky'],'Age':[28,34,29,42]}
In[53]: df = pd.DataFrame(data)
In[54]: print(df)
Age Name
0 28 Tom
1 34 Jack
2 29 Steve
3 42 Ricky
In[55]: df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4'])
In[56]: print(df)
Age Name
rank1 28 Tom
rank2 34 Jack
rank3 29 Steve
rank4 42 Ricky
从字典创建
字典键默认为列名
In[57]: data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
In[58]: df = pd.DataFrame(data) #缺失值使用NaN补充
In[59]: print(df)
a b c
0 1 2 NaN
1 5 10 20.0
In[60]: df = pd.DataFrame(data,index=['first','second'])
In[61]: print(df)
a b c
first 1 2 NaN
second 5 10 20.0
In[62]: df1 = pd.DataFrame(data, index=['first', 'second'], columns=['a','b']) #使用字典键值创建列名
In[63]: print(df1)
a b
first 1 2
second 5 10
In[64]: df2 = pd.DataFrame(data, index=['first', 'second'], columns=['a','b1']) #使用字典键以外的值创建列名
In[65]: print(df2)
a b1
first 1 NaN
second 5 NaN
从系列字典创建
使用系列索引并集作为DataFrame
的索引
In[69]: d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
...: 'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
In[70]: df = pd.DataFrame(d) #此处不能设置index
In[71]: print(df)
one two
a 1.0 1
b 2.0 2
c 3.0 3
d NaN 4
自定义索引
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Minsu','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])}
df = pd.DataFrame(d)
print(df)
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Minsu 4.60
6 23 Jack 3.80
7 34 Lee 3.78
8 40 David 2.98
9 30 Gasper 4.80
10 51 Betina 4.10
df.index = [chr(i) for i in range(ord("a"),ord("m"))]
print(df)
Age Name Rating
a 25 Tom 4.23
b 26 James 3.24
c 25 Ricky 3.98
d 23 Vin 2.56
e 30 Steve 3.20
f 29 Minsu 4.60
g 23 Jack 3.80
h 34 Lee 3.78
i 40 David 2.98
j 30 Gasper 4.80
k 51 Betina 4.10
l 46 Andres 3.65
列操作
选择列
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
In[72]: print(df['one'])
a 1.0
b 2.0
c 3.0
d NaN
Name: one, dtype: float64
添加列
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
In[81]: df['three'] = pd.Series([10,20,40],index=['a','b','c'])
In[82]: print(df)
one two three
a 1.0 1 10.0
b 2.0 2 20.0
c 3.0 3 40.0
d NaN 4 NaN
In[83]: df['four'] = df['one']+df['two']
In[84]: print(df)
one two three four
a 1.0 1 10.0 2.0
b 2.0 2 20.0 4.0
c 3.0 3 40.0 6.0
d NaN 4 NaN NaN
删除列
In[85]: print(df)
one two three four
a 1.0 1 10.0 2.0
b 2.0 2 20.0 4.0
c 3.0 3 40.0 6.0
d NaN 4 NaN NaN
In[86]: del df['one'] #直接在原DataFrame中删除对应列
In[87]: print(df)
two three four
a 1 10.0 2.0
b 2 20.0 4.0
c 3 40.0 6.0
d 4 NaN NaN
In[88]: df.pop('three') #返回选择列内容,并在原DataFrame中删除对应列
Out[88]:
a 10.0
b 20.0
c 40.0
d NaN
Name: three, dtype: float64
In[89]: print(df)
two four
a 1 2.0
b 2 4.0
c 3 6.0
d 4 NaN
行操作
标签选择
In[91]: d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
...: 'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
...: df = pd.DataFrame(d)
In[92]: print(df)
one two
a 1.0 1
b 2.0 2
c 3.0 3
d NaN 4
In[93]: print(df.loc['b'])
one 2.0
two 2.0
Name: b, dtype: float6
位置选择
In[96]: print(df.iloc[3])
one NaN
two 4.0
Name: d, dtype: float64
切片
In[99]: print(df[2:4])
one two
c 3.0 3
d NaN 4
添加行
In[105]: df1 = pd.DataFrame([[1,2],[3,4]], columns = ['a', 'b'])
In[106]: df2 = pd.DataFrame([[5,6],[7,8]], columns = ['a', 'b'])
In[107]: print(df1)
a b
0 1 2
1 3 4
In[108]: print(df2)
a b
0 5 6
1 7 8
In[109]: df1 = df1.append(df2)
In[110]: print(df2)
a b
0 5 6
1 7 8
In[111]: print(df1) # 注意行索引
a b
0 1 2
1 3 4
0 5 6
1 7 8
In[114]: print(df1.loc[1])
a b
1 3 4
1 7 8
删除行
drop()
返回删除指定行后的内容,但是不能直接修改原DataFrame
如果有标签重复,则删除多行
In[119]: print(df1)
a b
0 1 2
1 3 4
0 5 6
1 7 8
In[120]: df1.drop(0)
Out[120]:
a b
1 3 4
1 7 8
In[121]: print(df1)
a b
0 1 2
1 3 4
0 5 6
1 7 8
In[122]: df1 = df1.drop(0)
In[123]: print(df1)
a b
1 3 4
1 7 8
综合定位
In[225]: print(df)
Age Name Rating
a 25 Tom 4.23
b 26 James 3.24
c 25 Ricky 3.98
d 23 Vin 2.56
e 30 Steve 3.20
f 29 Minsu 4.60
g 23 Jack 3.80
loc[]
通过关键字符来定位;只有一维列表时,默认定位行;只要索引范围中含有一个正确值,错误地方会用NaN替代In[280]: print(df.loc[['a','z'],['Age','time']]) Age time a 25.0 NaN z NaN NaN
iloc[]
通过位置来定位;只有以为列表时,默认定位列;超出范围时报错
打印第一行
In[254]: print(df.loc['a'])
Age 25
Name Tom
Rating 4.23
Name: a, dtype: object
In[255]: print(df.iloc[0])
Age 25
Name Tom
Rating 4.23
Name: a, dtype: object
In[256]: print(df.iloc[0:1,:])
Age Name Rating
a 25 Tom 4.23
In[257]: print(df.iloc[0:1])
Age Name Rating
a 25 Tom 4.23
打印前两行
In[227]: print(df.loc[['a','b']])
Age Name Rating
a 25 Tom 4.23
b 26 James 3.24
In[229]: print(df.iloc[[0,1]])
Age Name Rating
a 25 Tom 4.23
b 26 James 3.24
In[230]: print(df.iloc[0:2,:])
Age Name Rating
a 25 Tom 4.23
b 26 James 3.24
打印前3行+后2列
In[270]: print(df.loc[['a','b','c'],['Name','Rating']])
Name Rating
a Tom 4.23
b James 3.24
c Ricky 3.98
In[231]: print(df.iloc[0:3,1:3])
Name Rating
a Tom 4.23
b James 3.24
c Ricky 3.98
In[237]: print(df.iloc[0:3,df.columns.size-2:df.columns.size])
Name Rating
a Tom 4.23
b James 3.24
c Ricky 3.98
In[291]: print(df.iloc[0:3,df.shape[1]-2:df.shape[1]])
Name Rating
a Tom 4.23
b James 3.24
c Ricky 3.98
打印第1列
In[261]: print(df['Name'])
a Tom
b James
c Ricky
d Vin
e Steve
f Minsu
g Jack
Name: Name, dtype: object
In[263]: print(df.iloc[:,1])
a Tom
b James
c Ricky
d Vin
e Steve
f Minsu
g Jack
Name: Name, dtype: object
Series基本功能
编号 | 属性或方法 | 描述 |
---|---|---|
1 | axes |
返回行轴标签列表。 |
2 | dtype |
返回对象的数据类型(dtype )。 |
3 | empty |
如果系列为空,则返回True 。 |
4 | ndim |
返回底层数据的维数,默认定义:1 。 |
5 | size |
返回基础数据中的元素数。 |
6 | values |
将系列作为ndarray 返回。 |
7 | head() |
返回前n 行。 |
8 | tail() |
返回最后n 行。 |
创建示例
In[124]: s = pd.Series(np.random.randn(4))
In[125]: print(s)
0 0.032700
1 0.589703
2 -0.122490
3 0.333868
dtype: float64
axes
In[126]: print(s.axes) # 返回行名标签列表
[RangeIndex(start=0, stop=4, step=1)]
empty
In[128]: print(s.empty) #判断是否为空表格
False
ndim
In[129]: print(s.ndim) #返回对象维数,一个Searies的一个1D数据结构
1
size
In[133]: print(s.size) # 返回系列的大小(长度)
4
values
In[134]: print(s.values) # 返回系列实际数据值
[ 0.03270012 0.58970334 -0.12249047 0.33386772]
head tail
In[135]: print(s.head(2))
0 0.032700
1 0.589703
dtype: float64
In[136]: print(s.tail(3))
1 0.589703
2 -0.122490
3 0.333868
dtype: float64
DataFrame基本功能
编号 | 属性或方法 | 描述 |
---|---|---|
1 | T |
转置行和列。 |
2 | axes |
返回一个列,行轴标签和列轴标签作为唯一的成员。 |
3 | dtypes |
返回此对象中的数据类型(dtypes )。 |
4 | empty |
如果NDFrame 完全为空[无项目],则返回为True ; 如果任何轴的长度为0 。 |
5 | ndim |
轴/数组维度大小。 |
6 | shape |
返回表示DataFrame 的维度的元组。 |
7 | size |
NDFrame 中的元素数。 |
8 | values |
NDFrame的Numpy表示。 |
9 | head() |
返回开头前n 行。 |
10 | tail() |
返回最后n 行。 |
创建示例
In[137]: d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Minsu','Jack']),
...: 'Age':pd.Series([25,26,25,23,30,29,23]),
...: 'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
In[138]: df = pd.DataFrame(d)
In[139]: print(df)
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Minsu 4.60
6 23 Jack 3.80
T
In[147]: print(df.T)
a b c d e f g
Age 25 26 25 23 30 29 23
Name Tom James Ricky Vin Steve Minsu Jack
Rating 4.23 3.24 3.98 2.56 3.2 4.6 3.8
axes
In[148]: print(df.axes) #返回行轴标签和列轴标签
[Index(['a', 'b', 'c', 'd', 'e', 'f', 'g'], dtype='object'), Index(['Age', 'Name', 'Rating'], dtype='object')]
dtypes
In[149]: print(df.dtypes)
Age int64
Name object
Rating float64
dtype: object
shape
In[152]: print(df.shape) #返回元组(a,b),a表示行数,b表示列数
(7, 3)
size
In[153]: print(df.size) # df所有元素数
21
In[243]: df.iloc[:,0].size #第一列的元素数,即行数
Out[243]:
7
In[244]: len(df)
Out[244]:
7
values
In[155]: print(df.values) #将DataFrame中的实际数据作为NDarray返回
[[25 'Tom' 4.23]
[26 'James' 3.24]
[25 'Ricky' 3.98]
[23 'Vin' 2.56]
[30 'Steve' 3.2]
[29 'Minsu' 4.6]
[23 'Jack' 3.8]]
索引名称
In[264]: print(df.index) #打印行索引
Index(['a', 'b', 'c', 'd', 'e', 'f', 'g'], dtype='object')
In[265]: print(df.columns) #打印列索引
Index(['Age', 'Name', 'Rating'], dtype='object')
行列统计
In[285]: print(len(df)) #统计行数
7
In[286]: print(df.columns.size) #统计列数
3
DataFrame描述性统计
编号 | 函数 | 描述 |
---|---|---|
1 | count() |
非空观测数量 |
2 | sum() |
所有值之和 |
3 | mean() |
所有值的平均值 |
4 | median() |
所有值的中位数 |
5 | mode() |
值的模值 |
6 | std() |
值的标准偏差 |
7 | min() |
所有值中的最小值 |
8 | max() |
所有值中的最大值 |
9 | abs() |
绝对值 |
10 | prod() |
数组元素的乘积 |
11 | cumsum() |
累计总和 |
12 | cumprod() |
累计乘积 |
统计摘要
In[298]: print(df.describe())
Age Rating
count 12.000000 12.000000
mean 31.833333 3.743333
std 9.232682 0.661628
min 23.000000 2.560000
25% 25.000000 3.230000
50% 29.500000 3.790000
75% 35.500000 4.132500
max 51.000000 4.800000
个别统计示例
In[295]: print(df.sum()) # 列求和
Age 382
Name TomJamesRickyVinSteveMinsuJackLeeDavidGasperBe...
Rating 44.92
dtype: object
In[296]: print(df.cumsum()) # 列累计求和
Age Name Rating
0 25 Tom 4.23
1 51 TomJames 7.47
2 76 TomJamesRicky 11.45
3 99 TomJamesRickyVin 14.01
4 129 TomJamesRickyVinSteve 17.21
5 158 TomJamesRickyVinSteveMinsu 21.81
6 181 TomJamesRickyVinSteveMinsuJack 25.61
7 215 TomJamesRickyVinSteveMinsuJackLee 29.39
8 255 TomJamesRickyVinSteveMinsuJackLeeDavid 32.37
9 285 TomJamesRickyVinSteveMinsuJackLeeDavidGasper 37.17
10 336 TomJamesRickyVinSteveMinsuJackLeeDavidGasperBe... 41.27
11 382 TomJamesRickyVinSteveMinsuJackLeeDavidGasperBe... 44.92
In[299]: print(df.mean()) # 列求均值
Age 31.833333
Rating 3.743333
dtype: float64
In[300]: print(df.std()) # 列求标准差
Age 9.232682
Rating 0.661628
dtype: float64
axis
sum()
mean()
std()
等默认axis=0
,以列为单位计算;设置axis=1
,以行为单位计算
In[317]: df.sum(axis=1)
Out[317]:
a 29.23
b 29.24
c 28.98
d 25.56
e 33.20
f 33.60
g 26.80
h 37.78
i 42.98
j 34.80
k 55.10
l 49.65
dtype: float64
In[319]: df.mean(axis=1)
Out[319]:
a 14.615
b 14.620
c 14.490
d 12.780
e 16.600
f 16.800
g 13.400
h 18.890
i 21.490
j 17.400
k 27.550
l 24.825
dtype: float64
函数
pipe()
将函数定义在每一个元素上
In[4]: df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
In[5]: def adder(ele1,ele2):
...: return ele1+ele2
...:
In[6]: print(df)
col1 col2 col3
0 1.123701 0.750719 0.556304
1 1.060900 -0.148950 1.589776
2 -1.861831 -0.526665 0.553255
3 -1.844168 0.932637 -1.051271
4 1.539621 0.931820 -0.210631
In[7]: print(df.pipe(adder,2))
col1 col2 col3
0 3.123701 2.750719 2.556304
1 3.060900 1.851050 3.589776
2 0.138169 1.473335 2.553255
3 0.155832 2.932637 0.948729
4 3.539621 2.931820 1.789369
apply()
axis=0
(默认)以列为单位,axis=1
以行为单位
In[12]: print(df.apply(np.mean))
col1 0.003645
col2 0.387912
col3 0.287487
dtype: float64
In[13]: df.mean()
Out[13]:
col1 0.003645
col2 0.387912
col3 0.287487
dtype: float64
In[14]: print(df.apply(np.mean,axis=1))
0 0.810242
1 0.833909
2 -0.611747
3 -0.654267
4 0.753603
dtype: float64
In[15]: df.apply(lambda x:x.max()-x.min())
Out[15]:
col1 3.401452
col2 1.459302
col3 2.641048
dtype: float64
In[16]: df.apply(lambda x:x.max()-x.min(),axis=1)
Out[16]:
0 0.567397
1 1.738727
2 2.415086
3 2.776805
4 1.750251
dtype: float64
applymap()
applymap(func)
也可以将函数定义在每个元素上,但是不能传递参数
In[28]: print(df.applymap(lambda x:x*2))
col1 col2 col3
0 2.247402 1.501439 1.112609
1 2.121800 -0.297900 3.179553
2 -3.723662 -1.053330 1.106511
3 -3.688336 1.865274 -2.102542
4 3.079241 1.863641 -0.421261
In[29]: print(df.pipe(lambda x,y:x*2+y,y=2))
col1 col2 col3
0 4.247402 3.501439 3.112609
1 4.121800 1.702100 5.179553
2 -1.723662 0.946670 3.106511
3 -1.688336 3.865274 -0.102542
4 5.079241 3.863641 1.578739
In[30]: print(df.applymap(lambda x,y:x*2+y,y=2))
TypeError: applymap() got an unexpected keyword argument 'y'
重建索引
reindex
In[31]: N=20
In[32]: df = pd.DataFrame({
...: 'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
...: 'x': np.linspace(0,stop=N-1,num=N), # 创建等差数列
...: 'y': np.random.rand(N), #生成[0,1)之间的随机浮点数
...: 'C': np.random.choice(['Low','Medium','High'],N).tolist(), #.choice随机取样
...: 'D': np.random.normal(100, 10, size=(N)).tolist()
...: })
In[33]: print(df)
A C D x y
0 2016-01-01 High 96.701722 0.0 0.399212
1 2016-01-02 High 109.993893 1.0 0.372344
2 2016-01-03 Low 93.826082 2.0 0.616053
3 2016-01-04 High 119.389641 3.0 0.406933
4 2016-01-05 High 87.518321 4.0 0.426282
5 2016-01-06 Low 91.836151 5.0 0.483436
6 2016-01-07 High 94.608244 6.0 0.540012
7 2016-01-08 High 108.886962 7.0 0.389494
8 2016-01-09 Low 106.946830 8.0 0.794819
9 2016-01-10 High 86.482129 9.0 0.919236
10 2016-01-11 Low 88.937570 10.0 0.824543
11 2016-01-12 Medium 104.843442 11.0 0.068905
12 2016-01-13 Low 96.481772 12.0 0.330995
13 2016-01-14 Low 97.454468 13.0 0.075122
14 2016-01-15 Low 94.906360 14.0 0.931858
15 2016-01-16 Medium 96.722896 15.0 0.775683
16 2016-01-17 Medium 116.414839 16.0 0.435225
17 2016-01-18 High 111.923778 17.0 0.492274
18 2016-01-19 High 122.022068 18.0 0.393136
19 2016-01-20 Low 109.190275 19.0 0.680880
In[44]: df_reindexed = df.reindex(index=[0,2,5], columns=['A','C','B'])
In[45]: print(df_reindexed)
A C B
0 2016-01-01 High NaN
2 2016-01-03 Low NaN
5 2016-01-06 Low NaN
reindex_like
根据另外一个对象的索引,重新标记自身的索引。
行列名称需要相互匹配,否则以NaN替代
In[63]: df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
...: df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
In[64]: print(df1)
col1 col2 col3
0 1.624844 0.278656 1.172339
1 0.145682 0.355114 -1.034259
2 0.901337 -0.987445 -0.598795
3 -0.750509 0.081066 1.014804
4 0.987722 2.106214 -0.722732
5 -0.254307 0.018380 1.453138
In[65]: print(df2)
col1 col2 col3
0 1.070348 0.076233 0.821260
1 0.694489 0.680185 -1.355397
In[66]: print(df1.reindex_like(df2)) # 根据df2的索引提取df1对应内容
col1 col2 col3
0 1.624844 0.278656 1.172339
1 0.145682 0.355114 -1.034259
In[67]: print(df2.reindex_like(df1))
col1 col2 col3
0 1.070348 0.076233 0.821260
1 0.694489 0.680185 -1.355397
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
In[68]: print(df2.reindex_like(df1,method='ffill'))
col1 col2 col3
0 1.070348 0.076233 0.821260
1 0.694489 0.680185 -1.355397
2 0.694489 0.680185 -1.355397
3 0.694489 0.680185 -1.355397
4 0.694489 0.680185 -1.355397
5 0.694489 0.680185 -1.355397
In[69]: print(df2.reindex_like(df1,method='ffill',limit=1))
col1 col2 col3
0 1.070348 0.076233 0.821260
1 0.694489 0.680185 -1.355397
2 0.694489 0.680185 -1.355397
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
填充方法有
pad/ffill
-向前填充;bfill/backfill
-向后填充;nearest
-从最近的索引值填充
limit
限定指定连续匹配的最大计数
重命名
In[70]: print(df1)
col1 col2 col3
0 1.624844 0.278656 1.172339
1 0.145682 0.355114 -1.034259
2 0.901337 -0.987445 -0.598795
3 -0.750509 0.081066 1.014804
4 0.987722 2.106214 -0.722732
5 -0.254307 0.018380 1.453138
In[71]: print(df1.rename(columns={'col1':'c1','col2':'c2'},index={0:'apple',1:'banana',2:'durian'}))
c1 c2 col3
apple 1.624844 0.278656 1.172339
banana 0.145682 0.355114 -1.034259
durian 0.901337 -0.987445 -0.598795
3 -0.750509 0.081066 1.014804
4 0.987722 2.106214 -0.722732
5 -0.254307 0.018380 1.453138
In[72]: df1.rename(columns={'col1':'c1','col2':'c2'},index={0:'apple',1:'banana',2:'durian'},inplace=True) #inplace=True,直接修改数据对象
In[73]: print(df1)
c1 c2 col3
apple 1.624844 0.278656 1.172339
banana 0.145682 0.355114 -1.034259
durian 0.901337 -0.987445 -0.598795
3 -0.750509 0.081066 1.014804
4 0.987722 2.106214 -0.722732
5 -0.254307 0.018380 1.453138
排序
In[89]: unsorted_df=pd.DataFrame(np.random.randn(5,2),index=[1,4,6,2,3],columns=['col2','col1'])
In[90]: print(unsorted_df)
col2 col1
1 -1.603360 -0.835863
4 -0.717269 -0.720635
6 -1.124588 -0.255081
2 -0.220290 -0.824135
3 0.975299 -0.728140
按标签排序
In[91]: print(unsorted_df.sort_index())
col2 col1
1 -1.603360 -0.835863
2 -0.220290 -0.824135
3 0.975299 -0.728140
4 -0.717269 -0.720635
6 -1.124588 -0.255081
In[92]: print(unsorted_df.sort_index(ascending=False)) #反向排序
col2 col1
6 -1.124588 -0.255081
4 -0.717269 -0.720635
3 0.975299 -0.728140
2 -0.220290 -0.824135
1 -1.603360 -0.835863
按列排序
In[93]: print(unsorted_df.sort_index(axis=1))
col1 col2
1 -0.835863 -1.603360
4 -0.720635 -0.717269
6 -0.255081 -1.124588
2 -0.824135 -0.220290
3 -0.728140 0.975299
按值排序
In[94]: print(unsorted_df.sort_values(by='col1'))
col2 col1
1 -1.603360 -0.835863
2 -0.220290 -0.824135
3 0.975299 -0.728140
4 -0.717269 -0.720635
6 -1.124588 -0.255081
In[96]: print(unsorted_df.sort_values(by=['col1','col2'])) #先按col1排序,col1值相同时,按照col2排序
col2 col1
1 -1.603360 -0.835863
2 -0.220290 -0.824135
3 0.975299 -0.728140
4 -0.717269 -0.720635
6 -1.124588 -0.255081
字符串和文本数据
编号 | 函数 | 描述 |
---|---|---|
1 | lower() |
将Series/Index 中的字符串转换为小写。 |
2 | upper() |
将Series/Index 中的字符串转换为大写。 |
3 | len() |
计算字符串长度。 |
4 | strip() |
帮助从两侧的系列/索引中的每个字符串中删除空格(包括换行符)。 |
5 | split(' ') |
用给定的模式拆分每个字符串。 |
6 | cat(sep=' ') |
使用给定的分隔符连接系列/索引元素。 |
7 | get_dummies() |
返回具有单热编码值的数据帧(DataFrame)。 |
8 | contains(pattern) |
如果元素中包含子字符串,则返回每个元素的布尔值True ,否则为False 。 |
9 | replace(a,b) |
将值a 替换为值b 。 |
10 | repeat(value) |
重复每个元素指定的次数。 |
11 | count(pattern) |
返回模式中每个元素的出现总数。 |
12 | startswith(pattern) |
如果系列/索引中的元素以模式开始,则返回true 。 |
13 | endswith(pattern) |
如果系列/索引中的元素以模式结束,则返回true 。 |
14 | find(pattern) |
返回模式第一次出现的位置。 |
15 | findall(pattern) |
返回模式的所有出现的列表。 |
16 | swapcase |
变换字母大小写。 |
17 | islower() |
检查系列/索引中每个字符串中的所有字符是否小写,返回布尔值 |
18 | isupper() |
检查系列/索引中每个字符串中的所有字符是否大写,返回布尔值 |
19 | isnumeric() |
检查系列/索引中每个字符串中的所有字符是否为数字,返回布尔值。 |
示例
In[161]: print(df1)
c1 c2 col3
apple a 0.278656 1.172339
banana B 0.355114 -1.034259
durian C -0.987445 -0.598795
3 D 0.081066 1.014804
4 e 2.106214 -0.722732
5 f 0.018380 1.453138
In[162]: print(df1['c1'].str.lower())
apple a
banana b
durian c
3 d
4 e
5 f
Name: c1, dtype: object
缺失值
In[165]: df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
...: 'h'],columns=['one', 'two', 'three'])
...:
...: df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
...:
...: print (df)
one two three
a -0.882456 0.591886 -0.696753
b NaN NaN NaN
c 0.674265 0.542562 -1.987910
d NaN NaN NaN
e 1.220943 0.368924 2.119967
f 0.663993 1.373907 -2.186622
g NaN NaN NaN
h -0.019313 0.016706 0.731410
检测
In[166]: print(df.isnull())
one two three
a False False False
b True True True
c False False False
d True True True
e False False False
f False False False
g True True True
h False False False
In[167]: print(df.notnull())
one two three
a True True True
b False False False
c True True True
d False False False
e True True True
f True True True
g False False False
h True True True
替换
In[169]: print(df.fillna(0)) #将NaN替换为0
one two three
a -0.882456 0.591886 -0.696753
b 0.000000 0.000000 0.000000
c 0.674265 0.542562 -1.987910
d 0.000000 0.000000 0.000000
e 1.220943 0.368924 2.119967
f 0.663993 1.373907 -2.186622
g 0.000000 0.000000 0.000000
h -0.019313 0.016706 0.731410
In[170]: print(df.fillna(method='pad')) # 用前一个数字填充
one two three
a -0.882456 0.591886 -0.696753
b -0.882456 0.591886 -0.696753
c 0.674265 0.542562 -1.987910
d 0.674265 0.542562 -1.987910
e 1.220943 0.368924 2.119967
f 0.663993 1.373907 -2.186622
g 0.663993 1.373907 -2.186622
h -0.019313 0.016706 0.731410
In[171]: print(df.fillna(method='bfill')) # 用后一个数字填充
one two three
a -0.882456 0.591886 -0.696753
b 0.674265 0.542562 -1.987910
c 0.674265 0.542562 -1.987910
d 1.220943 0.368924 2.119967
e 1.220943 0.368924 2.119967
f 0.663993 1.373907 -2.186622
g -0.019313 0.016706 0.731410
h -0.019313 0.016706 0.731410
丢弃
In[172]: print(df.dropna())
one two three
a -0.882456 0.591886 -0.696753
c 0.674265 0.542562 -1.987910
e 1.220943 0.368924 2.119967
f 0.663993 1.373907 -2.186622
h -0.019313 0.016706 0.731410
In[173]: print(df.dropna(axis=1))
Empty DataFrame
Columns: []
Index: [a, b, c, d, e, f, g, h]
替换
In[182]: print(df)
one two
0 10 1000
1 20 0
2 30 30
3 40 40
4 50 50
5 2000 60
In[183]: print (df.replace({1000:10,2000:60}))
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60
分组
In[218]: ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
...: 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
...: 'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
...: 'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
...: 'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
...: df = pd.DataFrame(ipl_data)
In[219]: print(df)
Points Rank Team Year
0 876 1 Riders 2014
1 789 2 Riders 2015
2 863 2 Devils 2014
3 673 3 Devils 2015
4 741 3 Kings 2014
5 812 4 kings 2015
6 756 1 Kings 2016
7 788 1 Kings 2017
8 694 2 Riders 2016
9 701 4 Royals 2014
10 804 1 Royals 2015
11 690 2 Riders 2017
按列分组
In[221]: grouped = df.groupby("Year")
In[222]: print(grouped)
In[223]: print(grouped.groups)
{2014: Int64Index([0, 2, 4, 9], dtype='int64'), 2015: Int64Index([1, 3, 5, 10], dtype='int64'), 2016: Int64Index([6, 8], dtype='int64'), 2017: Int64Index([7, 11], dtype='int64')}
In[224]: for name, group in grouped: # 默认情况下,group对象具有与分组相同的标签名称
...: print(name)
...: print(group)
...:
2014
Points Rank Team Year
0 876 1 Riders 2014
2 863 2 Devils 2014
4 741 3 Kings 2014
9 701 4 Royals 2014
2015
Points Rank Team Year
1 789 2 Riders 2015
3 673 3 Devils 2015
5 812 4 kings 2015
10 804 1 Royals 2015
2016
Points Rank Team Year
6 756 1 Kings 2016
8 694 2 Riders 2016
2017
Points Rank Team Year
7 788 1 Kings 2017
11 690 2 Riders 2017
In[6]: grouped2 = df.groupby(['Team','Year']) #按多列分组
获取一个分组
In[7]: grouped = df.groupby('Year')
In[8]: print (grouped.get_group(2014))
Points Rank Team Year
0 876 1 Riders 2014
2 863 2 Devils 2014
4 741 3 Kings 2014
9 701 4 Royals 2014
聚合
In[9]: grouped = df.groupby('Year')
In[10]: print (grouped['Points'].agg(np.mean)) # 计算不同分组中Points列的均值
Year
2014 795.25
2015 769.50
2016 725.00
2017 739.00
Name: Points, dtype: float64
In[11]: print (grouped.agg(np.size)) # 查看每个分组的大小
Points Rank Team
Year
2014 4 4 4
2015 4 4 4
2016 2 2 2
2017 2 2 2
In[13]: print (grouped['Points'].agg([np.mean,np.sum,np.std])) # 一次使用多个聚合函数
mean sum std
Year
2014 795.25 3181 87.439026
2015 769.50 3078 65.035888
2016 725.00 1450 43.840620
2017 739.00 1478 69.296465
In[21]: print(grouped.get_group(2014)['Points'].agg([np.mean,np.sum])) #特异计算2014的属性
mean 795.25
sum 3181.00
Name: Points, dtype: float64
转换
In[30]: grouped = df.groupby("Year")
In[31]: score = lambda x: (x - x.mean()) / x.std()*10
In[32]: print (grouped.transform(score))
Points Rank
0 9.235007 -11.618950
1 2.998345 -3.872983
2 7.748256 -3.872983
3 -14.837962 3.872983
4 -6.204323 3.872983
5 6.534854 11.618950
6 7.071068 -7.071068
7 7.071068 -7.071068
8 -7.071068 7.071068
9 -10.778940 11.618950
10 5.304763 -11.618950
11 -7.071068 7.071068
过滤
In[34]: print(df.groupby('Year').size())
Year
2014 4
2015 4
2016 2
2017 2
dtype: int64
In[35]: filter = df.groupby("Year").filter(lambda x:len(x)>=3) # 只保留数目大于3的对象
In[36]: print(filter)
Points Rank Team Year
0 876 1 Riders 2014
1 789 2 Riders 2015
2 863 2 Devils 2014
3 673 3 Devils 2015
4 741 3 Kings 2014
5 812 4 kings 2015
9 701 4 Royals 2014
10 804 1 Royals 2015
合并
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True)
- left - 一个DataFrame对象。
- right - 另一个DataFrame对象。
- on - 列(名称)连接,必须在左和右DataFrame对象中存在(找到)。
- left_on - 左侧DataFrame中的列用作键,可以是列名或长度等于DataFrame长度的数组。
- right_on - 右侧DataFrame的列作为键,可以是列名或长度等于DataFrame长度的数组。
- left_index - 如果为
True
,则使用左侧DataFrame中的索引(行标签)作为其连接键。 在具有MultiIndex(分层)的DataFrame的情况下,级别的数量必须与来自右DataFrame的连接键的数量相匹配。- right_index - 与右DataFrame的left_index具有相同的用法。
- how - 它是left, right, outer以及inner之中的一个,默认为内inner。 下面将介绍每种方法的用法。
- sort - 按照字典顺序通过连接键对结果DataFrame进行排序。默认为
True
,设置为False
时,在很多情况下大大提高性能。
In[47]: print(left)
Name id subject_id
0 Alex 1 sub1
1 Amy 2 sub2
2 Allen 3 sub4
3 Alice 4 sub6
4 Ayoung 5 sub5
In[48]: print(right)
Name id subject_id
0 Billy 1 sub2
1 Brian 2 sub4
2 Bran 3 sub3
3 Bryce 4 sub6
4 Betty 5 sub5
In[50]: print(pd.merge(left,right,on=['id','subject_id']))
Name_x id subject_id Name_y
0 Alice 4 sub6 Bryce
1 Ayoung 5 sub5 Betty
In[52]: print(pd.merge(left,right,on=['id','subject_id'],how='left')) # 输出左侧dataframe的所有内容,右侧没有的话用NaN替代
Name_x id subject_id Name_y
0 Alex 1 sub1 NaN
1 Amy 2 sub2 NaN
2 Allen 3 sub4 NaN
3 Alice 4 sub6 Bryce
4 Ayoung 5 sub5 Betty
In[53]: print(pd.merge(left,right,on=['id','subject_id'],how='right')) # 输出右侧dataframe的所有内容
Name_x id subject_id Name_y
0 Alice 4 sub6 Bryce
1 Ayoung 5 sub5 Betty
2 NaN 1 sub2 Billy
3 NaN 2 sub4 Brian
4 NaN 3 sub3 Bran
In[54]: print(pd.merge(left,right,on=['id','subject_id'],how='outer')) # 输出两个dataframe的所有内容
Name_x id subject_id Name_y
0 Alex 1 sub1 NaN
1 Amy 2 sub2 NaN
2 Allen 3 sub4 NaN
3 Alice 4 sub6 Bryce
4 Ayoung 5 sub5 Betty
5 NaN 1 sub2 Billy
6 NaN 2 sub4 Brian
7 NaN 3 sub3 Bran
In[55]: print(pd.merge(left,right,on=['id','subject_id'],how='inner')) # 默认为inner
Name_x id subject_id Name_y
0 Alice 4 sub6 Bryce
1 Ayoung 5 sub5 Betty
数据读取
常规文本
pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer',
names=None, index_col=None, usecols=None)
pandas.read_table(filepath_or_buffer, sep='\t', delimiter=None, header='infer',
names=None, index_col=None, usecols=None)
filepath_or_buffer:文件路径
sep: str, 分隔符
delimiter: str, 定界符,备选分隔符(设置该参数,sep失效)
header: int or list of ints, 指定行数用来作为列名
names: array-like, 对格列重命名,如果数据有表头,但想用新表头,可以设置
header=0,names=['a','b']
实现表头重制index_col: int or sequence or False, 用作行索引的列编号或列名,可以通过
index_col=[0,1]
来指定文件第1列和第2列作为索引usecols: array-like, 返回一个数据子集,即选取某几列,不读取整个文件,
usecols=[1,2]
orusecols=['a','b']
squeeze: boolean, default False, 如果文件只包含一列,则返回一个Series
prefix : str, default None, 在没有列标题时,给列添加前缀。例如:添加‘X’ 成为 X0, X1, ...
mangle_dupe_cols : boolean, default True, 重复的列,将‘X’...’X’表示为‘X.0’...’X.N’。如果设定为False则会将所有重名列覆盖。
skiprows : list-like or integer, default None,需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)。
nrows : int, default None,需要读取的行数(从文件头开始算起)。
skip_blank_lines :boolean, default True,如果为True,则跳过空行;否则记为NaN。
In[67]: df = pd.read_table("test_data.txt") # 默认第一行作为列名,索引为新生成的编号
In[68]: print(df)
gene_id ERR1698194 ERR1698195 ERR1698196
0 AT1G01010 21 58 24
1 AT1G01020 429 603 675
2 AT1G01030 10 32 187
3 AT1G01040 1237 2061 1376
4 AT1G01050 406 502 122
5 AT1G01060 0 274 41
In[71]: df = pd.read_table("test_data.txt",header=1)
In[72]: print(df)
AT1G01010 21 58 24
0 AT1G01020 429 603 675
1 AT1G01030 10 32 187
2 AT1G01040 1237 2061 1376
3 AT1G01050 406 502 122
4 AT1G01060 0 274 41
In[73]: df = pd.read_table("test_data.txt",header=None) # 不设置表头
In[74]: print(df)
0 1 2 3
0 gene_id ERR1698194 ERR1698195 ERR1698196
1 AT1G01010 21 58 24
2 AT1G01020 429 603 675
3 AT1G01030 10 32 187
4 AT1G01040 1237 2061 1376
5 AT1G01050 406 502 122
6 AT1G01060 0 274 41
In[89]: df = pd.read_table("test_data.txt",names=['a','b','c','d']) # 自定义表头,保留原来的第一行内容
In[90]: print(df)
a b c d
0 gene_id ERR1698194 ERR1698195 ERR1698196
1 AT1G01010 21 58 24
2 AT1G01020 429 603 675
3 AT1G01030 10 32 187
4 AT1G01040 1237 2061 1376
5 AT1G01050 406 502 122
6 AT1G01060 0 274 41
In[91]: df = pd.read_table("test_data.txt",names=['a','b','c','d'],header=1) # 自定以表头,并跳过header指定的前面行
In[92]: print(df)
a b c d
0 AT1G01020 429 603 675
1 AT1G01030 10 32 187
2 AT1G01040 1237 2061 1376
3 AT1G01050 406 502 122
4 AT1G01060 0 274 41
In[77]: df = pd.read_table("test_data.txt",index_col=[0])
In[78]: print(df)
ERR1698194 ERR1698195 ERR1698196
gene_id
AT1G01010 21 58 24
AT1G01020 429 603 675
AT1G01030 10 32 187
AT1G01040 1237 2061 1376
AT1G01050 406 502 122
AT1G01060 0 274 41
In[87]: df = pd.read_table("test_data.txt",index_col=['gene_id'])
In[88]: print(df)
ERR1698194 ERR1698195 ERR1698196
gene_id
AT1G01010 21 58 24
AT1G01020 429 603 675
AT1G01030 10 32 187
AT1G01040 1237 2061 1376
AT1G01050 406 502 122
AT1G01060 0 274 41
In[79]: df = pd.read_table("test_data.txt",index_col=[0,1]) # 用前两列作为行索引
In[80]: print(df)
ERR1698195 ERR1698196
gene_id ERR1698194
AT1G01010 21 58 24
AT1G01020 429 603 675
AT1G01030 10 32 187
AT1G01040 1237 2061 1376
AT1G01050 406 502 122
AT1G01060 0 274 41
excel
read_excel(io, sheetname=0, header=0, skiprows=None, skip_footer=0, index_col=None,names=None, parse_cols=None, parse_dates=False,date_parser=None,na_values=None,thousands=None, convert_float=True, has_index_names=None, converters=None,dtype=None, true_values=None, false_values=None, engine=None, squeeze=False, **kwds)
- io : string, path object ; excel 路径。
- sheetname : string, int, mixed list of strings/ints, or None, default 0 返回多表使用sheetname=[0,1],若sheetname=None是返回全表 注意:int/string 返回的是dataframe,而none和list返回的是dict of dataframe
- header : int, list of ints, default 0 指定列名行,默认0,即取第一行,数据为列名行以下的数据 若数据不含列名,则设定 header = None
- skiprows : list-like,Rows to skip at the beginning,省略指定行数的数据
- skip_footer : int,default 0, 省略从尾部数的int行数据
- index_col : int, list of ints, default None指定列为索引列,也可以使用u”strings”
- names : array-like, default None, 指定列的名字。
输出
DataFrame.to_csv(path_or_buf=None, sep=', ', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, mode='w', encoding=None, compression=None, quoting=None, quotechar='"', line_terminator='\n', chunksize=None, tupleize_cols=None, date_format=None, doublequote=True, escapechar=None, decimal='.')
DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True, encoding=None, inf_rep='inf', verbose=True, freeze_panes=None)
na_rep,缺失值填充
mode='w',表示写入,同名文件直接覆盖;'a'表示追加