Pandas 选择数据

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'])

输出结果如下:
Pandas 选择数据

通过[ ]选择,对行进行切片,如下所示:

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'])

输出结果如下:
Pandas 选择数据

按标签选择

通过标签获取一行数据,如下所示:

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]])

输出结果如下:
Pandas 选择数据

通过标签在多个轴上选择数据,如下所示:

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']])

输出结果如下:
Pandas 选择数据

通过标签同时在两个轴上切片:

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']])

输出结果如下:
Pandas 选择数据

减小返回对象的大小:

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']])

输出结果如下:
Pandas 选择数据

获取标量值:

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])

输出结果如下:
Pandas 选择数据

通过整数切片,类似于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])

输出结果如下:
Pandas 选择数据

通过传递整数的列表按位置切片,类似于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]])

输出结果如下:
Pandas 选择数据

整行切片:

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, :])

输出结果如下:
Pandas 选择数据

整列切片:

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])

输出结果如下:
Pandas 选择数据

获取具体值:

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])

输出结果如下:
Pandas 选择数据

从满足布尔条件的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])

输出结果如下:
Pandas 选择数据

使用 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'])])

输出结果如下:
Pandas 选择数据

赋值

添加新列将自动根据索引对齐数据,如下所示:

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)

输出结果:
Pandas 选择数据

通过标签赋值:

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数据处理
Pandas 数据读写

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程