【问题标题】:pandas to_csv converts str column to int(or float)pandas to_csv 将 str 列转换为 int(或 float)
【发布时间】:2019-01-16 12:32:32
【问题描述】:

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

【问题讨论】:

  • 你有NaN 值吗?
  • DataFrame 是否可以包含您想要数值的列(csv 输出中的混合类型),或者您是否尝试将每一列输出为字符串?
  • @JoshFriedlander:在将我的数据帧保存到 csv 之前:我将所有 NAN 转换为“”。然而 to_csv 在 csv 中重新引入了 NAN,但这不是问题,因为当我读取文件时,我可以简单地执行 fillna('',inplace=True)。
  • @John:我有很多类型的列:int 和 str。我注意到我的一些 str 列被转换为 int (在这些列中只有字母数字 str )
  • 您称其为“奇怪的行为”,但 csv 文件在字符串、整数、布尔值等之间没有区别。它只是一个文本文件。加载它是差异的来源。如果导出带有字符串'Text' 的列,它也会被存储为text 而不是'text',就像'1' 被存储为1(就像int 1)...

标签: python pandas csv


【解决方案1】:

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

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

您可能希望考虑使用 Pickle 来确保您的数据框保持不变:

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

print(df.dtypes)
# 0    object
# 1     int64
# dtype: object

【讨论】:

  • 这个想法不错,但有一些调整。当我保存列的 dtype 时,目标列被保存为“对象”类型。所以当我用这个 dtype 重新加载我的数据框时,不幸的是它并没有解决我的问题。所以我找到了一种方法将 concenred 列打开为 str 而不仅仅是一个“对象”类型
  • @mouni93,Pandas 中没有str dtype 之类的东西,字符串存储在object dtype 列中。当您重新加载数据帧时检查type(df['0'].iat[0]) 以向自己证明它们是字符串,即使df['0'] dtype 给出object
【解决方案2】:

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

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)

创建的csv文件是:

""  0   1   2
0   "a" "1.2"   "4.2"
1   "b" "70"    "0.03"
2   "x" "5" "0"

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

''  0   1   2
0   'a' '1.2'   '4.2'
1   'b' '70'    '0.03'
2   'x' '5' '0'

【讨论】:

  • 当列中的所有值都是"1" 时,这是否有效?它对我不起作用..
猜你喜欢
  • 1970-01-01
  • 2022-12-23
  • 2021-11-02
  • 2017-03-08
  • 2016-07-19
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多