【问题标题】:include commas in strings when saving to_csv - pandas保存 to_csv 时在字符串中包含逗号 - 熊猫
【发布时间】:2020-04-07 03:30:30
【问题描述】:
df1 = pd.DataFrame({'x':'ble','y':[[1,2]]})
df2 = pd.DataFrame({'x':'bla','y':[np.array([1,2])]})

df1.to_csv('df1.csv', sep='\t')
df2.to_csv('df2.csv', sep='\t')

df1.csv 将保留逗号

x   y
ble [1, 2]

df2.csv 不会

x   y
bla [1 2]

然后将数据帧连接起来 (df3.csv)

x   y
ble [1,2]
bla [1 2]

我稍后在 python 中阅读了df3.csv 并将y 转换回带有ast._literal_eval 的列表,但这不适用于第二行。我可以以某种方式告诉to_csv 包含逗号,无论它是 python 列表还是 numpy 数组?

【问题讨论】:

  • 我建议使用 to_pickle 来存储 python 对象以获得可信数据:df1.to_pickle('df1.pkl') df2.to_pickle('df2.pkl') 并使用 pd.read_pickle('df2.pkl') 读取,这样你就不必像它那样做 ast.literal_eval将列表存储为列表,将数组存储为数组,但请按照here 中提到的那样查看警告
  • to_csvstr 表示写入文件。对于具有 '[1,2]' 的列表,对于 ndarray '[1 2]'。加载时,两者都是字符串。因此csv 不是保存此数据帧的好格式。
  • 如果你需要一个文本文件,那么你也可以使用df.to_json(fn)`` and then read it back with pd.read_json(fn)``` CSV 并不是真正为嵌套数据结构设计的。

标签: python arrays pandas numpy


【解决方案1】:

您只是看到了两个类的str 表示的区别:

In [215]: print([1,2])                                                                         
[1, 2]
In [216]: print(np.array([1,2]))                                                               
[1 2]

在您的一个测试用例中,数组嵌入在一个列表中,具有不同的表示:

In [227]: pd.__version__                                                                       
Out[227]: '0.25.3'
In [228]: df=pd.DataFrame([{'x':'ble','y':[[1,2]]}, 
     ...: {'x':'bla','y':[np.array([1,2])]}, 
     ...: {'x':'bli','y':np.array([1,2])} 
     ...: ])                                                                                   
In [229]: df                                                                                   
Out[229]: 
     x         y
0  ble  [[1, 2]]
1  bla  [[1, 2]]
2  bli    [1, 2]
In [230]: df.to_csv('test.csv')                                                                
In [231]: cat test.csv                                                                         
,x,y
0,ble,"[[1, 2]]"
1,bla,"[array([1, 2])]"
2,bli,[1 2]

您应该to_csv,但我们似乎无法很好地控制这一点。记住csv 是用来存储简单的表、列的行。数据框也是如此。在元素中存储列表或数组是一种额外的嵌套,不适合这种格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2018-08-08
    • 2011-06-11
    • 1970-01-01
    • 2022-06-23
    • 2016-01-17
    • 1970-01-01
    相关资源
    最近更新 更多