Pandas 选择数据,虽然用于选择和赋值的标准Python / Numpy
表达式非常直观,并且便于交互工作,但是对于生产环境的代码,我们推荐优化的 Pandas 数据访问方法.at
、 .iat
、.loc
和.iloc
。
学习本章内容,可以先了解pandas 基础教程
获取
选择一个列,产生一个“Series”,相当于“df.A”,如下所示:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df['A'])
输出结果如下:
通过[ ]
选择,对行进行切片,如下所示:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df[0:3])
print('------------')
print(df['20130102':'20130104'])
输出结果如下:
按标签选择
通过标签获取一行数据,如下所示:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df.loc[dates[0]])
输出结果如下:
通过标签在多个轴上选择数据,如下所示:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df.loc[:, ['A', 'B']])
输出结果如下:
通过标签同时在两个轴上切片:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df.loc['20130102':'20130104', ['A', 'B']])
输出结果如下:
减小返回对象的大小:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df.loc['20130102', ['A', 'B']])
输出结果如下:
获取标量值:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df.loc[dates[0], 'A'])
输出结果如下:
-1.583564354273995
快速访问标量(和上面的方法效果相同):
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df.at[dates[0], 'A'])
输出结果如下:
0.3384516906695255
按位置选择
通过传递的整数的位置选择:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df.iloc[3])
输出结果如下:
通过整数切片,类似于numpy/Python:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df.iloc[3:5, 0:2])
输出结果如下:
通过传递整数的列表按位置切片,类似于numpy/Python:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df.iloc[[1, 2, 4], [0, 2]])
输出结果如下:
整行切片:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df.iloc[1:3, :])
输出结果如下:
整列切片:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df.iloc[:, 1:3])
输出结果如下:
获取具体值:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df.iloc[1, 1])
输出结果如下:
-0.43449049909839393
快速访问标量(等价于之前的方法):
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df.iat[1, 1])
输出结果如下:
-0.24652941049825397
布尔索引
使用单个列的值来选择数据:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df[df.A > 0])
输出结果如下:
从满足布尔条件的DataFrame中选择值:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df[df > 0])
输出结果如下:
使用 isin()
方法过滤:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
df2 = df.copy()
df2['E'] = ['one', 'one', 'two', 'three', 'four', 'three']
print(df2)
print('------------')
print(df2[df2['E'].isin(['two', 'four'])])
输出结果如下:
赋值
添加新列将自动根据索引对齐数据,如下所示:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
s1 = pd.Series([1, 2, 3, 4, 5, 6], index=pd.date_range('20130102', periods=6))
print(s1)
df['F'] = s1
print('------------')
print(df)
输出结果:
通过标签赋值:
df.at[dates[0], 'A'] = 0
通过位置赋值:
df.iat[0, 1] = 0
使用NumPy数组赋值:
df.loc[:, 'D'] = np.array([5] * len(df))
带有where
条件的赋值操作:
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
df2 = df.copy()
df2[df2 > 0] = -df2
print(df2)
输出结果如下:
更多pandas知识点,请参考:
Pandas 教程
Pandas数据处理
Pandas 数据读写