pandas 是进行数据处理和分析的 python 库。下文将展开学习 DataFrame、Series 的实用操作。
推荐用 jupyter notebook 或 colab 进行实验。
read_csv
从 csv 文件读入数据import pandas as pd
df = pd.read_csv(“data.csv”, sep=",")
df.head() # 显示 DataFrame 的前几个记录
names = pd.Series(['A', 'B', 'C'])
count = pd.Series([111,222,333])
df = pd.DataFrame({"Name": names, "Count": count})
panel = pd.Panel({'one': df, 'two': df-df.mean()})
Pandas 支持3种索引:
.loc
第一维用 index 的 label 来选择行,第二维可以用 columns 的label 选择列,左右都是闭区间。如果不存在这个key会报错KeyError。
[]
可以用 columns 的 label 来选择列。用 labels list 来选择多列。或位置的 slice range选择行。或Boolean 数组。
.iloc
用 整数位置、slice range,第一维选择行的位置范围,第二维选择列,这里是左闭右开。注意两个维度都是先行再列。
实例
df = pd.DataFrame(np.random.randn(8, 4),
index=list(range(8)), columns=['size', 'length', 'weight', 'height'])
df.index # 可以得到index属性
dates = pd.date_range('1/1/2000', periods=8)
# 重建索引
df.reindex(dates)
df[['length', 'height']] = df[['height', 'length']]
# 但是 df.loc[:, ['length', 'height']] = df[['height', 'length']] 是没用的 because
# the column alignment is before value assignment.,得
df.loc[:, ['length', 'height']] = df[['height', 'length']].to_numpy()
注意:通过.
来操作属性,要求属性不能和存在的方法重名。
不能是不存在的属性。
df.length #获取 length 列的Series
sa = pd.Series([1, 2, 3], index=list('abc'))
sa.b # 获取index为b的值
panel.one # 获取label为one的DataFrame
s[:5] # 前5行
s[::2] # 步进为2,每隔1行取一行
s[::-1] # 倒着取
dfl = pd.DataFrame(np.random.randn(5, 4),
columns=list('ABCD'),
index=pd.date_range('20130101', periods=5))
# 可以取index为 20130102到20130104(包含)的值
dfl.loc['20130102':'20130104']
s1 = pd.Series(np.random.randn(6), index=list('abcdef'))
s1.loc['c':] = 0 #可以对后面每一行统一赋值
s1.loc['b']
df1 = pd.DataFrame(np.random.randn(6, 4),
index=list('abcdef'),
columns=list('ABCD'))
df1.loc[['a', 'b', 'd'], :] # 使用labels 的 list 获取多行
df1.loc['d':, 'A':'C'] # 获取d及后面行的A~C列
df1.loc['a'] > 0 # 得到一个布尔 Series,代表第'a'行每一列是否满足>0
df1.loc[:, df1.loc['a'] > 0] #得到满足条件的列的值
df1.loc['a', 'A'] # 获取一个明确位置的值。等价于 df1.at['a','A']
df1 = pd.DataFrame(np.random.randn(6, 4),
index=list(range(0, 12, 2)),
columns=list(range(0, 8, 2)))
df1.iloc[:3] #前3行
df1.iloc[1:5, 2:4] #1~4行,2~3列
# 通过list、slice取
df1.iloc[[1, 3, 5], [1, 3]]
df1.iloc[1:3, :]
#单个整数取
df1.iloc[1, 1]
df1.iloc[1]
# 不存在的slice index可以正确处理,会返回空的DataFrame或Series
df1 = pd.DataFrame(np.random.randn(6, 4),
index=list('abcdef'),
columns=list('ABCD'))
df1.loc[lambda df: df.A > 0, :] # 取A列大于0的行。
df1.A.loc[lambda s: s > 0] # 也可以在Series上使用callable index
df[df['A'] > 0] # 取第A列大于0的行
df2 = pd.DataFrame({'a': ['one', 'one', 'two', 'three', 'two', 'one', 'six'],
'b': ['x', 'y', 'y', 'x', 'y', 'x', 'x'],
'c': np.random.randn(7)})
# 使用map 方法来创建复杂的criteria
criterion = df2['a'].map(lambda x: x.startswith('t'))
df2[criterion]
# 用&来加上其它条件
df2[criterion & (df2['b'] == 'x')]
df.where(df > 0) # 用NaN 替代不满足条件的值
df.where(df > 0, -df) # 用指定数据代替不满足条件的值
f = pd.DataFrame(np.random.rand(10, 3), columns=list('abc'))
df[(df.a < df.b) & (df.b < df.c)] #等价于
df.query('(a<b) & (b<c)')
import numpy as np
s1 / np.sum(s1)
s1.apply(lambda val: val > 1)