Pandas 学习笔记

pandas 是进行数据处理和分析的 python 库。下文将展开学习 DataFrame、Series 的实用操作。

推荐用 jupyter notebook 或 colab 进行实验。

read_csv 从 csv 文件读入数据

import pandas as pd
df = pd.read_csv(“data.csv”, sep=",")
df.head() # 显示 DataFrame 的前几个记录

创建 Series,DataFrame 和 Panel

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种索引:

  1. .loc 第一维用 index 的 label 来选择行,第二维可以用 columns 的label 选择列,左右都是闭区间。如果不存在这个key会报错KeyError。

  2. [] 可以用 columns 的 label 来选择列。用 labels list 来选择多列。或位置的 slice range选择行。或Boolean 数组。

  3. .iloc 用 整数位置、slice range,第一维选择行的位置范围,第二维选择列,这里是左闭右开。

注意两个维度都是先行再列。

实例

df = pd.DataFrame(np.random.randn(8, 4),
        index=list(range(8)), columns=['size', 'length', 'weight', 'height'])

获取index、重建index

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

Slicing ranges

s[:5] # 前5行
s[::2] # 步进为2,每隔1行取一行
s[::-1] # 倒着取

用 Label 取

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

用Callable来取

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

Where的使用

df.where(df > 0) # 用NaN 替代不满足条件的值
df.where(df > 0, -df) # 用指定数据代替不满足条件的值

Query的使用

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

操控数据

  1. 直接对Series执行运算。
  2. 直接用 numpy 函数进行计算。
  3. 使用apply 将函数应用到整列上
    import numpy as np
    s1 / np.sum(s1)
    s1.apply(lambda val: val > 1)

Previous Post Next Post