Pandas Dataframe 将我的字典变成了字符串

Posted

技术标签:

【中文标题】Pandas Dataframe 将我的字典变成了字符串【英文标题】:Pandas Dataframe Turned my Dictionaries into String 【发布时间】:2019-03-05 00:01:32 【问题描述】:

我有一个数据框,每个单元格保存一个字典。在导出数据框之前,我可以将每个单元格称为单独的数据框。

但是,在将数据框保存为 csv 并重新打开后,每个单元格都变成了字符串,因此我无法再将调用的单元格转换为数据框。

The output should look like this

After saving the dataframe as csv, dictionary became string

在对 *** 进行研究后得知,我感到很惊讶,没有多少人遇到与我相同的问题。我想知道我的做法是不是错了。我只找到了两个与我的问题相关的帖子。这是一个(dict objects converting to string when read from csv to dataframe pandas python)。

我基本上尝试过 json、ast.literal_eval 和 yaml,但这些都不能解决我的问题。

这是我的代码的第一部分(我创建了这四个列表来存储我从 api 调用的数据)

tickers4 = []
last_1st_bs4 = []
last_2nd_bs4 = []
last_3rd_bs4 = []

for i in range(len(tickers)):
    try:
        ticker = tickers.loc[i, 'ticker']
        ann_yr = 2018

        yr_1st = intrinio.financials_period(ticker, str(ann_yr-1), fiscal_period='FY', statement='balance_sheet')
        yr_2nd = intrinio.financials_period(ticker, str(ann_yr-2), fiscal_period='FY', statement='balance_sheet')
        yr_3rd = intrinio.financials_period(ticker, str(ann_yr-3), fiscal_period='FY', statement='balance_sheet')

        tickers4.append(ticker)
        last_1st_bs4.append(yr_1st)
        last_2nd_bs4.append(yr_2nd)
        last_3rd_bs4.append(yr_3rd)

        print(' Feeding data '.format(i, ticker))

    except:
        tickers4.append(ticker)
        last_1st_bs4.append(0)
        last_2nd_bs4.append(0)
        last_3rd_bs4.append(0)
        print(' Error '.format(i, ticker))

第二部分:我将它们放入数据框并保存为 csv

BS = pd.DataFrame()
BS['ticker'] = tickers4
BS['BS_2017'] = last_1st_bs4
BS['BS_2016'] = last_2nd_bs4
BS['BS_2015'] = last_3rd_bs4
BS.to_csv('Balance_Sheet_2015_2017.csv')

现在,我需要在另一个笔记本中阅读此 csv

BS = pd.read_csv('./Balance_Sheet_2015_2017.csv', index_col=0)
BS.loc[9, 'BS_2017']

这是我得到的结果: ' cashandequivalents shortterminvestments notereceivable \\\nyear \n2017 2.028900e+10 5.389200e+10 1.779900e+10 \n\n accountsreceivable netinventory othercurrentassets \\\nyear \n2017 1.787400e+10 4.855000e+09 1.393600e+10 \n\n totalcurrentassets netppe longterminvestments \\\nyear \n2017 1.286450e+11 3.378300e+10 1.947140e+11 \n\n othernoncurrentassets ... \\\nyear ... \n2017 1.817700e+10 ... \n\n commitmentsandcontingencies commonequity retainedearnings \\\nyear \n2017 0.0 3.586700e+10 9.833000e+10 \n\n aoci totalcommonequity totalequity \\\nyear \n2017 -150000000.0 1.340470e+11 1.340470e+11 \n\n totalequityandnoncontrollinginterests totalliabilitiesandequity \\\nyear \n2017 1.340470e+11 3.753190e+11 \n\n currentdeferredrevenue noncurrentdeferredrevenue \nyear \n2017 7.548000e+09 2.836000e+09 \n\n[1 rows x 30 columns]'

感谢您的帮助。

【问题讨论】:

把你的代码snd输出放在这里而不是链接。 我想知道您是否要将其导出到文件中并下次将其加载到python中?或者您只是想将其导出为文件并使用一些图形软件加载? 【参考方案1】:

CSV 不是保存字典的合适格式(老实说,将字典放入 DataFrame 并不是一个很好的数据结构)。您应该尝试将 DataFrame 写入 json:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_json.html

【讨论】:

感谢您提供替代方法。你知道我是否可以将字符串转换回字典吗?我花了几天时间收集这些数据。 @JonZhao 你可以使用 json library d = json.loads(j),它会再次将你的字符串转换为字典 @NagaKiran 我试过 json、ast.literal_eval 和 yaml。但是, json 和 eval 会引发缩进错误。 yaml 仍然返回一个字符串,但格式更好。 我应该早点知道。 pickle 以原始格式保存数据框,但 csv 将您的数据框保存到逗号分隔列表中!我希望我早点读到这个。 ***.com/questions/48770542/…【参考方案2】:

我曾经遇到过同样的错误。我通过使用DataFrame.to_pickle() 而不是DataFrame.to_csv() 解决了这个问题。

CSV 文件中的所有内容都是纯文本,甚至是数值。当您将 CSV 文件加载到电子表格程序中时,有一些解析器会查找可识别为数字或日期的字符串,并进行相应的转换。

CSV 文件无法轻松保存更复杂的 Python 对象,但如果将 Python 对象放在 DataFrame 中,Pandas 不会抛出错误。它将它们转换为它们的字符串表示形式。

【讨论】:

嗨,约翰,我想这在我保存数据框之前会起作用,但我的原始数据格式已经改变,我正在尝试将其转换回字典。感谢您的解决方案,我将在未来使用。

以上是关于Pandas Dataframe 将我的字典变成了字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 For 循环修改 Pandas 中的 DataFrame 字典

如何停止 Pandas Dataframe read_json 方法将我的时代转换为人类可读的字符串

将 pandas Dataframe 列映射到字典值

pandas使用字典列表创建dataframe(list of dictionaries)pandas使用字典数据创建dataframe(dictionary)

pandas/numpy:我有一个数组,里面有一个字典。如何从中创建 DataFrame? [复制]

带有嵌套字典的 Pandas DataFrame