数据帧的数据帧:写入和读取

问题描述 投票:0回答:1

我有一组图像。在每个图像中,程序会查找具有属性

X
type
的对象。对象的数量因图像而异。因此,对于一张图像,我有一个
df_objects
,其中有
N_objects
行和 2 列
X
type

然后我构建一个

df_images
,其中图像为行,列为
time
objects
,其中对象的条目是上面的
df_objects
。这在程序中非常有效。当然兴趣是存储结构,我尝试运行,
DataFrame.to_csv

然后我通过

pd.read_csv
阅读了它。例如,使用读取
df_images
似乎可以工作,我可以打印图像 1 的
df_objects
。但不完全是:
df_objects["type"]
不被接受并生成错误:

类型错误:字符串索引必须是整数

尽管代码与原始 df 上测试的代码完全相同。请参阅下面的代码。谢谢!

import pandas as pd

df1 = pd.DataFrame({"X":(1.1,1.2),"type":("a_1","b_1")})
print(' df1')
print(df1)
df2 = pd.DataFrame({"X":(2.1,2.2,2.3),"type":("a_2","b_2","c_2")})
print(' df2')
print(df2)
print('  ')
dfT = pd.DataFrame ({"time":(6,7),"dff":(df1,df2)})
df1_test = dfT["dff"][0]
print(' df1_test')
print(df1_test)
df2_test = dfT["dff"][1]
print(' df2_test')
print(df2_test)
print('  ')
type_list_evt_1 = df1_test["type"]
print(' type_list_evt_1')
print(type_list_evt_1)
print('  ')

dfT.to_csv(path_or_buf = "test_dff.csv", index = "False")

read_dfT = pd.read_csv('test_dff.csv')

df1_read = read_dfT["dff"][0]
print(' df1_read')
print(df1_read)
df2_read = read_dfT["dff"][1]
print(' df2_read')
print(df2_read)
print('  ')
type_list_evt_1_read = df1_read["type"]
print(' type_list_evt_1_read')
print(type_list_evt_1_read)

我希望 df 读回的行为严格与 df 写入的行为一致

python pandas dataframe csv
1个回答
0
投票

如果您更喜欢易于检查和编辑的格式,则可以使用JSON。这里每个

df_objects
都可以作为 JSON 存储在主 DataFrame 中。

例如:

import pandas as pd
import json
from io import StringIO

df1 = pd.DataFrame({"X": [1.1, 1.2], "type": ["a_1", "b_1"]})
df2 = pd.DataFrame({"X": [2.1, 2.2, 2.3], "type": ["a_2", "b_2", "c_2"]})

df1_json = df1.to_json(orient='split')
df2_json = df2.to_json(orient='split')

df_images = pd.DataFrame({
    "time": [6, 7],
    "objects": [df1_json, df2_json]
})

# Save DataFrame as CSV
df_images.to_csv("df_images.csv", index=False)
read_df_images = pd.read_csv("df_images.csv")

read_df_images["objects"] = read_df_images["objects"].apply(lambda x: pd.read_json(StringIO(x), orient='split'))

df1_read = read_df_images["objects"][0]
print("df1_read")
print(df1_read)

type_list_evt_1_read = df1_read["type"]
print("type_list_evt_1_read")
print(type_list_evt_1_read)

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.