pandas to_csv 将 str 列转换为 int(或 float)

mou*_*i93 6 python csv pandas

作为无标题,我注意到 pandas 'to_csv' 会自动转换只有字母数字字符串为 float 的列。我正在 Jupyter 笔记本中创建一个数据框,并创建一个充满值“1”的列 ['A']。因此,我有一个由一列字符串“1”组成的数据框。当我使用“to_csv”将数据帧转换为 csv 文件时。输出csv文件是一列充满整数1。
您可能会建议我在jupyter中重新加载时将该列重新转换为字符串,但是这是行不通的,因为我事先不知道哪些列可能会因为这种行为而受到惩罚。有没有办法避免这种奇怪的情况。

far*_*kas 6

quoting您可以在 中设置参数to_csv,看一下这个例子:

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a)
df.to_csv('test.csv', sep='\t', quoting=csv.QUOTE_NONNUMERIC)
Run Code Online (Sandbox Code Playgroud)

创建的csv文件为:

""  0   1   2
0   "a" "1.2"   "4.2"
1   "b" "70"    "0.03"
2   "x" "5" "0"
Run Code Online (Sandbox Code Playgroud)

您还可以使用参数设置引号字符quotechar,例如quotechar="'"将产生以下输出:

''  0   1   2
0   'a' '1.2'   '4.2'
1   'b' '70'    '0.03'
2   'x' '5' '0'
Run Code Online (Sandbox Code Playgroud)


jpp*_*jpp 4

一种方法是单独存储您的类型并使用您的数据加载它:

df = pd.DataFrame({0: ['1', '1', '1'],
                   1: [2, 3, 4]})

df.dtypes.to_frame('types').to_csv('types.csv')
df.to_csv('file.csv', index=False)

df_types = pd.read_csv('types.csv')['types']
df = pd.read_csv('file.csv', dtype=df_types.to_dict())

print(df.dtypes)
# 0    object
# 1     int64
# dtype: object
Run Code Online (Sandbox Code Playgroud)

您可能希望考虑 Pickle 以确保您的数据框保证不变:

df.to_pickle('file.pkl')
df = pd.read_pickle('file.pkl')

print(df.dtypes)
# 0    object
# 1     int64
# dtype: object
Run Code Online (Sandbox Code Playgroud)