我有一组图像。在每个图像中,程序会查找具有属性
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 写入的行为一致
如果您更喜欢易于检查和编辑的格式,则可以使用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)
希望这有帮助。