【问题标题】:Pandas read_csv(): column contains dataframe but is read as stringPandas read_csv():列包​​含数据框,但被读取为字符串
【发布时间】:2020-01-19 18:02:35
【问题描述】:

我有一个由 56 行和 9 列组成的 pandas 数据框 (df1),一列 ['Matrix'] 每个单元格包含一个数据框 (df2)。保存和加载这个 df1 会将 df2 变成一个字符串。但是,我需要这是一个数据框。

我遇到了几种解决方案(见下文),但似乎无法将这些解决方案应用于我的情况,因为我有一个包含数据框的数据框。

df2 由两列('Mean'、'SD')组成,每 df1 行包含 95k 行(下面的示例(它们不全为 0 ;))。

我的直觉是,我的方法本身并不理想。

有人能给我一个正确的方向吗?

' 平均 SD\r\n0 0.00 0.000000\r\n1 0.00 0.000000\r\n2 0.00 0.000000\r\n3 0.00 0.000000\r\n4 0.00 0.000000\r\n5 0.00 0.000000\r\n00000006. \n7 0.00 0.000000\r\n8 0.00 0.000000\r\n9 …… 0.000000\r\n95194 0.00 0.000000\r\n95195 0.00 0.000000\r\n95196 0.00 0.000000\r\n95197 0.00 0.000000\r\n95198 0.00 0.000000\r\n95199 0.00 0.000000\r\n\r\n[95200 rows x 2列]'

【问题讨论】:

  • 您只需要遍历df1 并将单元格转换为数据框。我已经有一段时间没有尝试过了,但您可以将其加载为 StringIO 对象并读取该对象:stackoverflow.com/questions/22604564/…。然后你可以将它存储在字典中,每个键都引用行号或类似的东西。 (您也可以保留它df1,但这通常从表格 pov 中没有多大意义)

标签: python python-3.x pandas dataframe


【解决方案1】:

您应该使用json 文件格式来保存您的DataFrame

考虑以下简化示例:

import pandas as pd

df1 = pd.DataFrame([[0,1], [2,3]], columns=["first", "second"])
df2 = pd.DataFrame([[4,5,6], [7,8,9]])
df1["dataf"] = [df2, df2]

print("\nDataFrame df1:")
print("**************")  
print(df1)
print("\ndataf column:")
print("***************")  
print(df1["dataf"])
print("\ndataf column cell:")
print("********************")  
print(df1["dataf"][0])
print("Type of dataf cells:", type(df1["dataf"][0]))

输出:

DataFrame df1:
**************
   first  second                             dataf
0      0       1     0  1  2
0  4  5  6
1  7  8  9
1      2       3     0  1  2
0  4  5  6
1  7  8  9

dataf column:
***************
0       0  1  2
0  4  5  6
1  7  8  9
1       0  1  2
0  4  5  6
1  7  8  9
Name: dataf, dtype: object

dataf column cell:
********************
   0  1  2
0  4  5  6
1  7  8  9
Type of dataf cells: <class 'pandas.core.frame.DataFrame'>

现在使用pandas.DataFrame.to_json 将我们的DataFrame 保存为json

df1.to_json("test.json")

使用pandas.read_json 加载我们的数据:

df1 = pd.read_json("test.json")

print("\nDataFrame df1:")
print("**************")  
print(df1)
print("\ndataf column:")
print("***************")  
print(df1["dataf"])
print("\ndataf column cell:")
print("********************")  
print(df1["dataf"][0])
print("Type of dataf cells:", type(df1["dataf"][0]))

输出:

DataFrame df1:
**************
   first  second                                              dataf
0      0       1  {'0': {'0': 4, '1': 7}, '1': {'0': 5, '1': 8},...
1      2       3  {'0': {'0': 4, '1': 7}, '1': {'0': 5, '1': 8},...

dataf column:
***************
0    {'0': {'0': 4, '1': 7}, '1': {'0': 5, '1': 8},...
1    {'0': {'0': 4, '1': 7}, '1': {'0': 5, '1': 8},...
Name: dataf, dtype: object

dataf column cell:
********************
{'0': {'0': 4, '1': 7}, '1': {'0': 5, '1': 8}, '2': {'0': 6, '1': 9}}
Type of dataf cells: <class 'dict'>

我们可以使用pandas.DataFrame.apply简单地将我们影响的列转换为DataFrames

df1["dataf"] = df1["dataf"].apply(lambda x: pd.DataFrame(x))

print("\nDataFrame df1:")
print("**************")  
print(df1)
print("\ndataf column:")
print("***************")  
print(df1["dataf"])
print("\ndataf column cell:")
print("********************")  
print(df1["dataf"][0])
print("Type of dataf cells:", type(df1["dataf"][0]))

输出:

DataFrame df1:
**************
   first  second                             dataf
0      0       1     0  1  2
0  4  5  6
1  7  8  9
1      2       3     0  1  2
0  4  5  6
1  7  8  9

dataf column:
***************
0       0  1  2
0  4  5  6
1  7  8  9
1       0  1  2
0  4  5  6
1  7  8  9
Name: dataf, dtype: object

dataf column cell:
********************
   0  1  2
0  4  5  6
1  7  8  9
Type of dataf cells: <class 'pandas.core.frame.DataFrame'>

可以看到我们的核心代码非常简单如下:

df1.to_json("test.json")
df1 = pd.read_json("test.json")
df1["dataf"] = df1["dataf"].apply(lambda x: pd.DataFrame(x))

【讨论】:

  • 太棒了,谢谢!如前所述,我怀疑我使用 csv 导出的方法。这是完美的。
猜你喜欢
  • 2018-09-16
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 2016-11-02
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多