Pandas

创建数据对象

# 标准导入
import pandas as pd

pd.Series([1, 3, 5, np.nan, 8])
# 指定 series 的 index, index 可重复
pd.Series([1, 3, 5, np.nan, 6, 8], index=['c', 'a', 'i', 'yong', 'j', 'i'])
# 创建 DataFrame
pd.DataFrame(np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]), index=['i', 'ii', 'iii'], columns=['A', 'B', 'C'])

访问

df.head(2)
df.tail(3)
df.describe()  # 描述统计信息

索引

df['A']  # 按列名取
df[0:3]  # 按行数取
df.loc['2021-01-01':'2021-01-02', ['A', 'B']]  # 指定具体的标签
df.loc[['2021-01-01', '2021-01-02'], ['A', 'B']]  # 指定具体的标签
df.loc[['std'], ...]
df.at[int(index), 'column_nam']  # 取点
df.iloc[3:5, 0: 3]  # 指定标签的索引位置

函数

# 对列排序
df.sort_values(by='C')
# 选择某列最大的 n 行数据
df.nlargest(2, 'A')
# 采样
df.sample(5)
df.sample(frac=0.01)  # 采样 1%

赋值

# 坐标赋值
df.iloc[2, 2] = 1111
# 轴名赋值
df.loc['20130101', 'B'] = 2222
# 根据条件赋值
df.B[df.A > 4] = 0
# 整列赋值
df['F'] = np.nan
df['E'] = pd.Series([1, 2, 3, 4, 5, 6])  # 长度要一致
# 多列赋值
a = [['a', '1.2', '4.2'], ['a', '70', '0.03'], ['b', '5', '0']]
df = pd.DataFrame(a, columns=['col1', 'col2', 'col3'])
df.col1[df.col1 == 'a'] = 'm'
data['type'].str.contains('red')
data['type'].isin(['red', 'yellow'])

布尔索引取反

python 内置 sum 对布尔索引求和,即计算其总数

abnormal = (data[areas[1]] < 10) | (data[areas[1]] > 1e4)
data = data[~abnormal]
sum(abnormal)

统计某一列中不同种类的个数:

data['Type'].value_counts()[0:20]

df 转换为 array

df.values

处理缺失值

df2.dropna(how='any')  # 非原位操作
df2.fillna(df2.mean())

绘图

np.random.seed(999)
df = pd.DataFrame(np.random.rand(10,4), columns = ['a', 'b', 'c', 'd'])
df.plot()
df.plot.bar()
df.plot.bar(stacked=True)
df.T  # 转置

拼接

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
          keys=None, levels=None, names=None, verify_integrity=False)

# 用 a 作为键内交,是默认的
df1.merge(df2, how='inner', on='a')
# how: left, right, cross

序列化

使用 pandas 直接序列化

import pandas as pd
df = pd.DataFrame([range(11), range(100,110)], columns=list('abcdefghijk'))
df.to_pickle('my_df.pickle')
df2 = pd.read_pickle('my_df.pickle')

统计