DataFrame
性质:一个表格型的数据结构。它提供有序的列和不同类型的列值。
from pandas import DataFrame
## 创建DataFrame ##
In [0]:
DataFrame({'col0':[1,2,3], 'col1':[4,5,6]})
Out[0]:
col0 col1
0 1 4
1 2 5
2 3 6
In [1]:
data = {'col0':[1,2,3], 'col1':[4,5,6]}
DataFrame(data,columns = ['col1','col0'])
Out[1]:
col1 col0
0 4 1
1 5 2
2 6 3
In [2]:
DataFrame(data,columns = ['col1','col0','col2'])
Out[2]:
col1 col0 col2
0 4 1 NaN
1 5 2 NaN
2 6 3 NaN
## 获取数据 ##
frame = DataFrame({'col0':[1,2,3], 'col1':[4,5,6]})
In [3]:
frame['col1']
Out[3]:
0 4
1 5
2 6
Name: col1, dtype: int64
In [4]:
frame.col1
Out[4]:
0 4
1 5
2 6
Name: col1, dtype: int64
## 删除数据 ##
del frame['col1']
In [5]:
frame
Out[5]:
col0
0 1
1 2
2 3
reindex
dataframe可以对index或者column使用reindex方法
#DataFrame使用reindex方法
import numpy as np
frame = DataFrame(np.arange(9).reshape((3, 3)), index = ['a', 'c', 'd'], columns = ['Ohio', 'Texas', 'California'])
frame
输出:
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
frame2 = frame.reindex(['a', 'b', 'c', 'd'])
frame2
输出:
Ohio Texas California
a 0.0 1.0 2.0
b NaN NaN NaN
c 3.0 4.0 5.0
d 6.0 7.0 8.0
states = ['Texas', 'Utah', 'California']
frame.reindex(columns = states)
输出:
Texas Utah California
a 1 NaN 2
c 4 NaN 5
d 7 NaN 8
#对DataFrame使用ffill方法,书里的写法会报错,用如下写法是没问题的
frame.reindex(index = ['a', 'b', 'c', 'd'], columns = states).ffill()
输出:
Texas Utah California
a 1.0 NaN 2.0
b 1.0 NaN 2.0
c 4.0 NaN 5.0
d 7.0 NaN 8.0
drop
loc和iloc
loc是指location的意思,iloc中的i是指integer。这两者的区别如下:
loc works on labels in the index.
iloc works on the positions in the index (so it only takes integers)
也就是说loc是根据index来索引,
如上table定义了一个index,那么loc就根据这个index来索引对应的行。
iloc是根据行号来索引,行号从0开始,逐次加1。
loc和iloc的对比:
df = DataFrame(np.arange(15).reshape((5, 3)), index = ['a', 'c', 'd', 'b', 'e'], columns = ['Ohio', 'Texas', 'California'])
df
输出:
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
b 9 10 11
e 12 13 14
df.loc['a':'b']
输出:
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
b 9 10 11
df.iloc[0:3]
输出
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
df.iloc['a':'b']
输出
报错
df.loc[0:3]
输出
报错
loc的一些用法:
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
index=['cobra', 'viper', 'sidewinder'],
columns=['max_speed', 'shield'])
df
输出
max_speed shield
cobra 1 2
viper 4 5
sidewinder 7 8
df.loc['viper'] # 输出为Seies
输出
max_speed 4
shield 5
Name: viper, dtype: int64
df.loc[['viper']] # 输出为DataFrame
输出
max_speed shield
viper 4 5
>>> df.loc['cobra', 'shield']
2
>>> df.loc['cobra':'viper', 'max_speed']
cobra 1
viper 4
Name: max_speed, dtype: int64
>>> df.loc[[False, False, True]]
max_speed shield
sidewinder 7 8
>>> df.loc[df['shield'] > 6]
max_speed shield
sidewinder 7 8
>>> df.loc[df['shield'] > 6, ['max_speed']]
max_speed
sidewinder 7
>>> df.loc[lambda df: df['shield'] == 8]
max_speed shield
sidewinder 7 8
# 对选中的元素设置值
>>> df.loc[['viper', 'sidewinder'], ['shield']] = 50
>>> df
max_speed shield
cobra 1 2
viper 4 50
sidewinder 7 50
# 对整行设置值
>>> df.loc['cobra'] = 10
>>> df
max_speed shield
cobra 10 10
viper 4 50
sidewinder 7 50
# 对整列设置值
>>> df.loc[:, 'max_speed'] = 30
>>> df
max_speed shield
cobra 30 10
viper 30 50
sidewinder 30 50
# 对满足条件的行设置值
>>> df.loc[df['shield'] > 35] = 0
>>> df
max_speed shield
cobra 30 10
viper 0 0
sidewinder 0 0
iloc的一些用法:
df.iloc[0] # 输出是一个Series
输出
Ohio 0
Texas 1
California 2
Name: a, dtype: int32
df.iloc[[0]] # 输出是DataFrame
输出
Ohio Texas California
a 0 1 2
df.iloc[[1, 4], [0, 2]]
输出
Ohio California
c 3 5
e 12 14
df.iloc[1:3, 0:3]
输出
Ohio Texas California
c 3 4 5
d 6 7 8
apply
#函数应用和映射
import numpy as np
import pandas as pd
df=pd.DataFrame(np.random.randn(4,3),columns=list('bde'),index=['utah','ohio','texas','oregon'])
print(df)
"""
b d e
utah -0.667969 1.974801 0.738890
ohio -0.896774 -0.790914 0.474183
texas 0.043476 0.890176 -0.662676
oregon 0.701109 -2.238288 -0.154442
"""
#将函数应用到由各列或行形成的一维数组上。DataFrame的apply方法可以实现此功能
f=lambda x:x.max()-x.min()
#默认情况下会以列为单位,分别对列应用函数
t1=df.apply(f)
print(t1)
t2=df.apply(f,axis=1)
print(t2)
"""
b 1.597883
d 4.213089
e 1.401566
dtype: float64
utah 2.642770
ohio 1.370957
texas 1.552852
oregon 2.939397
dtype: float64
"""
#除标量外,传递给apply的函数还可以返回由多个值组成的Series
def f(x):
return pd.Series([x.min(),x.max()],index=['min','max'])
t3=df.apply(f)
#从运行的结果可以看出,按列调用的顺序,调用函数运行的结果在右边依次追加
print(t3)
"""
b d e
min -0.896774 -2.238288 -0.662676
max 0.701109 1.974801 0.738890
"""
#元素级的python函数,将函数应用到每一个元素
#将DataFrame中的各个浮点值保留两位小数
f=lambda x: '%.2f'%x
t3=df.applymap(f)
print(t3)
"""
b d e
utah -0.67 1.97 0.74
ohio -0.90 -0.79 0.47
texas 0.04 0.89 -0.66
oregon 0.70 -2.24 -0.15
"""
#注意,之所以这里用map,是因为Series有一个元素级函数的map方法。而dataframe只有applymap。
t4=df['e'].map(f)
print(t4)
"""
utah 0.74
ohio 0.47
texas -0.66
oregon -0.15
"""
排序
##### DataFrame按引索引/列索引排序,
# 默认axis=0,行索引排序
# axis=1,列索引排序
frame = DataFrame(np.random.randn(4, 3), columns=list('dbe'),index=['Ut', 'Oh', 'Tex', 'Ore'])
输出
d b e
Ut 1.343094 -0.593928 0.428803
Oh -0.834637 -0.942729 1.095775
Tex 0.358518 -0.048092 1.330677
Ore -0.562642 -0.176548 -0.551305
frame.sort_index() # 默认按行升序排序
输出
d b e
Oh -0.834637 -0.942729 1.095775
Ore -0.562642 -0.176548 -0.551305
Tex 0.358518 -0.048092 1.330677
Ut 1.343094 -0.593928 0.428803
frame.sort_index(ascending=False)
输出
d b e
Ut 1.343094 -0.593928 0.428803
Tex 0.358518 -0.048092 1.330677
Ore -0.562642 -0.176548 -0.551305
Oh -0.834637 -0.942729 1.095775
frame.sort_index(axis=1)
输出
b d e
Ut -0.593928 1.343094 0.428803
Oh -0.942729 -0.834637 1.095775
Tex -0.048092 0.358518 1.330677
Ore -0.176548 -0.562642 -0.551305
frame.sort_index(axis=1, ascending=False)
输出
e d b
Ut 0.428803 1.343094 -0.593928
Oh 1.095775 -0.834637 -0.942729
Tex 1.330677 0.358518 -0.048092
Ore -0.551305 -0.562642 -0.176548
##### DataFrame按列排序
frame = DataFrame({'a': [1, 3, 1, 5], 'b': [2, 1, 4, 6]})
frame
输出
a b
0 1 2
1 3 1
2 1 4
3 5 6
# sort_values方法
frame.sort_values(by=['a', 'b'], ascending=[True, True])
输出
a b
0 1 2
2 1 4
1 3 1
3 5 6
frame.sort_values(by=['a', 'b'], ascending=[True, False])
输出
a b
2 1 4
0 1 2
1 3 1
3 5 6
汇总统计和计算
df = DataFrame(np.arange(15).reshape((5, 3)), index = ['a', 'c', 'd', 'b', 'e'], columns = ['Ohio', 'Texas', 'California'])
df
输出
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
b 9 10 11
e 12 13 14
df.sum()
输出
Ohio 30
Texas 35
California 40
dtype: int64
df.sum(axis = 1)
输出
a 3
c 12
d 21
b 30
e 39
dtype: int64
df.cumsum() # 纵向汇总_累计汇总
输出
Ohio Texas California
a 0 1 2
c 3 5 7
d 9 12 15
b 18 22 26
e 30 35 40
df.max() # 获取每列最大值
输出
Ohio 12
Texas 13
California 14
dtype: int32
df.max() # 获取每行最大值
输出
a 2
c 5
d 8
b 11
e 14
dtype: int32
df.idxmax() # 获取每列最大值对应的索引
输出
Ohio e
Texas e
California e
dtype: object
df.idxmax(axis = 1) # 获取每行最大值对应的索引
输出
a California
c California
d California
b California
e California
dtype: object
缺失值处理
df = DataFrame(np.arange(15).reshape((5, 3)), index = ['a', 'c', 'd', 'b', 'e'], columns = ['Ohio', 'Texas', 'California'])
df.iloc[[1],[1]] = None
df
输出
Ohio Texas California
a 0 1.0 2
c 3 NaN 5
d 6 7.0 8
b 9 10.0 11
e 12 13.0 14
df.dropna()
输出
Ohio Texas California
a 0 1.0 2
d 6 7.0 8
b 9 10.0 11
e 12 13.0 14
df.iloc[[2]] = None
df
输出
Ohio Texas California
a 0.0 1.0 2.0
c 3.0 NaN 5.0
d NaN NaN NaN
b 9.0 10.0 11.0
e 12.0 13.0 14.0
df.dropna(how='all')
输出
Ohio Texas California
a 0 1.0 2
c 3 NaN 5
d 6 7.0 8
b 9 10.0 11
e 12 13.0 14
数据合并
a)pandas.merge():数据库风格的合并
b)pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起
pd.concat([s1,s2,s3]) #默认concat在竖轴(axis=0)上连接,即产生新的Series。
数据转换:对数据的过滤、清理以及其他的转换操作
替换值
data.replace(value,np.nan)
data.replace([value1, value2],[ np.nan,0])
重命名轴索引
data.rename(index=str.title,columns=str.upper)
参考:
Python之DataFrame常用方法小结
Python学习笔记(6):Pandas的reindex方法
Python中的lambda和apply用法
python学习笔记—DataFrame和Series的排序