Pandas CSV 及 Excel 操作备忘录

本文最后更新于:2020-08-22 15:52

最近笔者用爬虫爬取了 48 万例病人数据,整个文件大小有 600m。用 MS Excel 处理的话,打开就得花 10min,每进行一个操作,少则 10s,多则 5min,有甚至直接卡死。无奈之下,只能用 Python 解决了,第一时间就想到了大名鼎鼎的 Pandas。

Pandas 是为 Python 编程语言编写的用于数据处理和分析的软件库,主要用于从各种文件格式(例如:CSV、JSON、SQL、Microsoft Excel)导入数据进行数据分析。

这里就记录一些 Pandas 代码以备忘

打开文件

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd
import numpy as np
import os
from pandas import DataFrame, Series
import re

os.chdir('/content/drive/Shared drives/Infinite/')

df = pd.read_csv('data5.csv', index_col = 0, encoding = 'gbk')
#pd.set_option('display.width', None) # 列之间的省略号
#pd.set_option('display.max_rows', None) # 行之间的省略号

将 DataFrame 写入文件

1
df.to_csv('data5.csv', encoding = 'gbk', na_rep='NA')

数据清洗

列出所有的 Column 的抬头

1
df.columns.values

查看数据

1
df.head(20) # 前20行
1
df[0:2] # 第1-2行数据

截取部分列的数据

1
2
df.loc[:, ['校正后年龄', '体检次数']]
df.loc[:, '校正后年龄': '体检次数']

删除列

1
2
3
4
5
list_to_del = [
'年龄',
'血压',
]
df = df.drop(list_to_del, axis = 1)

对某列进行操作

1
df['年龄'] = df['年龄'].map(lambda x: re.sub('岁', '', str(x)))
1
df['校正后年龄'] = df.apply(lambda x: int(x['年龄']) - 2020 + int(x['日期'][0:4]) if not x['年龄'] == 'nan' else 'NA', axis=1)
1
df['年龄'] = df['年龄'] * 2
1
df = df.loc[-(df['性别'] == 2)] # 删除性别是2的数据
1
2
df = df.drop_duplicates(['month', 'day'])  #移除month和day列包含重复值的行,保留第一个
df = df.drop_duplicates(['month'], take_last = True )#移除month列包含重复值的行,保留最后一个
1
df.rename(columns = {'ISI': 'isi'}, inplace = True) #ISI列列名改为isi

显示空值的数目

1
df.isna().sum()
1
2
for item in df.columns.values:
print(item, df[item].isna().sum())

将控制用 NA 填充

1
df = df.fillna('NA')

替换数据

1
df['血压'] = df['血压'].replace('110/33mmHg', '110/80mmHg') # 把'110/33mmHg'替换成'110/80mmHg'

数据统计

计算某列变量频数

1
df['校正后年龄'].unique()     #输出month列唯一值
1
df['校正后年龄'].value_counts()   #输出month列各变量出现频数