我有一个由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列]'
答案 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))