Pandas 常用操作

整理 pandas 常用操作
整理记录工作学习中遇到的所有 pandas 操作

设置输出宽度

http://pandas.pydata.org/pandas-docs/stable/options.html

1
pd.set_option('display.width', None)

设置成 None 后,在打印 dataframe 时,所有的列名将不会再换行,看起来会比较清晰、舒服

更改列名

http://stackoverflow.com/questions/11346283/renaming-columns-in-pandas

1
df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})

dataframe 长度

1
len(df.index)

所有列的数据类型

1
df.dtypes

merge

http://pandas.pydata.org/pandas-docs/stable/merging.html

1
result = pd.merge(left, right, on=['key1', 'key2'])

update

dfdf2index 必须要保证数据类型一样,特别要注意 intstring;因为两者人眼并不能看出来,但是就因为数据类型不一样就会导致 update 总是没有效果

1
df.update(df2)

append

1
df = df.append(df2)

读取 csv 文件

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

1
df = pd.read_csv(csv_path)

保存为 csv 文件

1
df.to_csv('test.csv', header=True, index=False, mode='w', encoding="utf8")

如果 csv 文件中有中文(无论是表头还是内容),可以将 encoding 设置为 encoding="gbk"

groupby 之后求去重个数

1
2
df.groupby(index).agg({'field': lambda x: len(x.unique())})
df.groupby(index).field.nunique()

检测是否为空

1
2
if df.empty:
print('df is empty.')

填充 NA/NaN

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html
将所有 NaN 替换为 0

1
2
3
df = df.fillna(0) # 填充为 0
df = df[df.field.notnull()] # 去掉 field 列为 NaN 的行
df = df.dropna() # 去掉任意列为 NaN 的行

sort 排序

http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.DataFrame.sort.html
默认升序,下列示例是以列 A 和 B 进行排序,其中 A 列升序,B 列降序

1
result = df.sort(['A', 'B'], ascending=[1, 0])

去重

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html
删除重复行,默认保留第一个

1
result = df.drop_duplicates()

新添一列

新列与其它列没有关系

1
2
3
df['new_col'] = value # 在最后列后插入新列
df.insert(0, 'new_col', value) # 在第一列前插入新列
df.insert(df.columns.get_loc('col1') + 1, 'new_col', value) # 在 col1 列后面插入新列

新列是通过其它列通过计算得出

比如将时间戳转为日期格式,或者将 ip 转为地址
又比如对于成绩表来说,我需要统计总分

1
df['new_col'] = df.apply(func, args=(arg1, arg2, ...))

更改列名顺序

假如 df 列名顺序为 ['A', 'B', 'C', 'D'],改成 ['D', 'C', 'B', 'A']

1
df = df[['D', 'C', 'B', 'A']]

只取其中部分列

1
df = df[['A', 'D']]

isin

1
2
df = df[df.field.isin(df2.field)]
df = df[~df.field.isin(df2.field)]

逻辑运算

1
2
3
df2 = df[(df["key0"] == 0) & (df["key1"] == 1)]
df2 = df[(df["key0"] == 0) | (df["key1"] == 1)]
df2 = df[~ (df["key0"] == 0)]

set_index

1
2
df = df.set_index(['field1', 'field2'])
df = df.reset_index()

聚合操作

1
df = df.groupby(['field1', 'field2']).agg({'field3': count, 'field3': lambda x: len(x.unique()), 'field4': sum})

遍历

1
2
for row in df.itertuples():
pass

astype

修改列类型

1
df['field'] = df['field'].astype(str)