pandas 输入输出

import pandas as pd
import numpy as np

CSV

数据交互

from io import StringIO
data = "col1,col2,col3\na,b,1\na,b,2\nc,d,3"
print(data)
col1,col2,col3
a,b,1
a,b,2
c,d,3
pd.read_csv(StringIO(data))

col1 col2 col3
0 a b 1
1 a b 2
2 c d 3

可以仅指定部分列:

pd.read_csv(StringIO(data), usecols=lambda x: x.upper() in ["COL1", "COL3"])

col1 col3
0 a 1
1 a 2
2 c 3

也可以仅指定部分行:

pd.read_csv(StringIO(data), skiprows=lambda x: x % 2 != 0)

col1 col2 col3
0 a b 2

可以使用 names 参数指定列名。如果希望替换原字符流第一行,则设置 header=0

data = "a,b,c\n1,2,3\n4,5,6\n7,8,9"
print(data)
a,b,c
1,2,3
4,5,6
7,8,9
pd.read_csv(StringIO(data), names=["foo", "bar", "baz"], header=0)

foo bar baz
0 1 2 3
1 4 5 6
2 7 8 9

如果第一行也是数据,列名需要手动添加,则设置 header=None

pd.read_csv(StringIO(data), names=["foo", "bar", "baz"], header=None)

foo bar baz
0 a b c
1 1 2 3
2 4 5 6
3 7 8 9

还可以实现跳过前面若干行的功能,例如跳过第一行:

data = "skip this skip it\na,b,c\n1,2,3\n4,5,6\n7,8,9"
print(data)
skip this skip it
a,b,c
1,2,3
4,5,6
7,8,9
pd.read_csv(StringIO(data), header=1)

a b c
0 1 2 3
1 4 5 6
2 7 8 9

使用 dtype='category',生成的类别将始终被解析为字符串。

data = "col1,col2,col3\na,b,1\na,b,2\nc,d,3"
df = pd.read_csv(StringIO(data), dtype="category")
df.dtypes
col1    category
col2    category
col3    category
dtype: object

使用参数 comment=# 来忽略以 # 开头的注释。

data = "\na,b,c\n  \n# commented line\n1,2,3\n\n4,5,6"
print(data)
a,b,c
  
# commented line
1,2,3

4,5,6
pd.read_csv(StringIO(data), comment="#")

a b c
0 1 2 3
1 4 5 6

使用参数 skip_blank_lines 来指定是否跳过空行,默认值为 True

data = "a,b,c\n\n1,2,3\n\n\n4,5,6"
pd.read_csv(StringIO(data), skip_blank_lines=False)

a b c
0 NaN NaN NaN
1 1.0 2.0 3.0
2 NaN NaN NaN
3 NaN NaN NaN
4 4.0 5.0 6.0

文件读写

df = pd.DataFrame(np.random.randint(0, 10, size=(3, 4)),
                  index=pd.date_range('2022/2/22', periods=3),
                  columns=list('ABCD'))
df.to_csv('foo.csv', encoding='utf-8')

参数 index_col=0 指定 csv 文件的第一列为 index

pd.read_csv('foo.csv', index_col=0)

A B C D
2022-02-22 1 0 9 6
2022-02-23 5 1 9 9
2022-02-24 6 1 7 0

Excel

使用 pandas 读写 Excel 文件需要安装 openpyxl 包。

df = pd.DataFrame(np.random.randint(0, 10, size=(3, 4)),
                  index=pd.date_range('2022/2/22', periods=3),
                  columns=list('ABCD'))
df.to_excel('foo.xlsx', sheet_name='Sheet1')
pd.read_excel('foo.xlsx', sheet_name='Sheet1', index_col=0, na_values=['NA'])

A B C D
2022-02-22 0 5 0 2
2022-02-23 6 5 9 5
2022-02-24 2 0 0 5
df2 = pd.DataFrame(np.random.randint(0, 10, size=(3, 4)),
                   index=pd.date_range('2022/2/22', periods=3),
                   columns=list('ABCD'))
df.to_excel('foo.xlsx', sheet_name='Sheet1')
df2.to_excel('foo.xlsx', sheet_name='Sheet2')

如果要读取一个 Excel 文件的多个 Sheet,使用 ExcelFile 对象。

data = {}
with pd.ExcelFile("foo.xlsx") as xlsx:
    data["Sheet1"] = pd.read_excel(xlsx, "Sheet1", index_col=0, na_values=['NA'])
    data["Sheet2"] = pd.read_excel(xlsx, "Sheet2", index_col=0, na_values=['NA'])
Previous