熊猫read_csv():列包含数据框,但作为字符串读取

时间:2020-01-18 07:22:13

标签: python python-3.x pandas dataframe

我有一个由56行和9列组成的熊猫数据框(df1),一列['Matrix']每个单元格包含一个数据框(df2)。保存并加载此df1会将df2转换为字符串。但是,我需要将其作为数据框。

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

df2由两列(“均值”,“ 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 \ n6 0.00 0.000000 \ r \ 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行x 2列]'

1 个答案:

答案 0 :(得分: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将影响的列转换为DataFrame s

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))