【问题标题】:Why is `pandas.read_csv` not the reciprocal of `pandas.DataFrame.to_csv`?为什么 `pandas.read_csv` 不是 `pandas.DataFrame.to_csv` 的倒数?
【发布时间】:2022-01-02 14:02:18
【问题描述】:

pandas.read_csv 不是df.to_csv 的直接倒数函数,这对我来说似乎很奇怪。在此图中,请注意在使用所有默认设置时,原始数据帧和最终数据帧的“未命名”列有何不同。

In [1]: import pandas as pd

In [2]: orig_df = pd.DataFrame({'AAA' : [4,5,6,7], 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]}); orig_df
Out[2]: 
   AAA  BBB  CCC
0    4   10  100
1    5   20   50
2    6   30  -30
3    7   40  -50

[4 rows x 3 columns]

In [3]: orig_df.to_csv('test.csv')

In [4]: final_df = pd.read_csv('test.csv'); final_df
Out[4]: 
   Unnamed: 0  AAA  BBB  CCC
0           0    4   10  100
1           1    5   20   50
2           2    6   30  -30
3           3    7   40  -50

[4 rows x 4 columns]

似乎默认的read_csv 应该改为

In [6]: final2_df = pd.read_csv('test.csv', index_col=0); final2_df
Out[7]: 
   AAA  BBB  CCC
0    4   10  100
1    5   20   50
2    6   30  -30
3    7   40  -50

[4 rows x 3 columns]

或者应该改为默认的to_csv

In [8]: df.to_csv('test2.csv', index=False)

读取时会给出

In [9]: pd.read_csv('test2.csv')
Out[9]: 
   AAA  BBB  CCC
0    4   10  100
1    5   20   50
2    6   30  -30
3    7   40  -50

[4 行 x 3 列]

(也许这应该发送给开发人员,但我真的很感兴趣为什么这是默认行为。希望它也可以帮助其他人避免我的困惑)。

【问题讨论】:

  • 我认为这是因为在您使用 pd.DataFrame.from_csv 之前,默认值确实是 index_col=0 但这造成了各种破坏,因为 csv 有各种奇怪的格式,所以这种行为与 @987654333 不同@。这是一个很好的观点,值得发布作为对github的改进
  • 说真正的倒数是from_csv,但它不再更新有利于一般的read_tableread_csv,它们具有更大的灵活性
  • 我在 read_excel 中学到了这一点,因为没有往返,例如,如果你保存一个多索引的 excel,你将很难将它恢复到数据帧中
  • 我通常不清楚是这里还是 GitHub(或两者兼有),但我认为这个肯定在 SO 中占有一席之地,因为你会获得更广泛的受众,我同意它是很高兴告知人们这样的默认行为(以及如何在需要时解决它)。

标签: python pandas dataframe


【解决方案1】:

感谢您向github 页面@EdChum 发送提示。这让我想到了pandas.DataFrame.from_csv 函数,它确实是pandas.DataFrame.to_csv 的倒数。

In [6]: final_df = pd.DataFrame.from_csv('test.csv')

In [7]: final_df
Out[7]: 
   AAA  BBB  CCC
0    4   10  100
1    5   20   50
2    6   30  -30
3    7   40  -50

[4 rows x 3 columns]

【讨论】:

  • 请注意,from_csv 不再更新,因此它的功能比read_csv 更有限
  • 不是真的。 from_csv 调用 read_csv 并定义了一些参数
  • 看来 from_csv 也不是多索引文件的倒数。
【解决方案2】:

如上所述,pd.FataFrame.from_csv 不再受支持。 from_csv 的倒数是:pd.read_csv(file_name, index_col=0)

例如:

import pandas as pd

df = pd.DataFrame({'name': ['Raphael', 'Donatello'],

                   'mask': ['red', 'purple'],

                   'weapon': ['sai', 'bo staff']})

file_name = "df.csv"
csv_df = df.to_csv(file_name)

reconstructed_df = pd.read_csv("df.csv", index_col=0)

print(reconstructed_df)

# will print
        name    mask    weapon
0    Raphael     red       sai
1  Donatello  purple  bo staff

【讨论】:

    猜你喜欢
    • 2022-10-04
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2018-08-14
    • 2012-01-10
    • 1970-01-01
    相关资源
    最近更新 更多