我想将DataFrame
对象存储为行的列值:
这是我想要实现的简化类比。
>>> df = pd.DataFrame([[1,2,3],[2,4,6]], columns=list('DEF'))
>>> df
166: D E F
0 1 2 3
1 2 4 6
我创建了一个新的DataFrame并随时添加了一个新列,因为我将新的DataFrame
对象作为新列的值插入。请参阅代码。
>>> df_in_df = pd.DataFrame([[11,13,17],[19, 23, 31]], columns=list('XYZ'))
>>> df.loc[df['F'] == 6, 'G'] = df_in_df
>>> df
D E F G
0 1 2 3 NaN
1 2 4 6 NaN
>>> df.loc[df['F'] == 6, 'G'].item()
nan
>>> # But the below works fine, i.e. when I insert an integer
>>> df.loc[df['F'] == 6, 'G'] = 4
>>> df
>>> D E F G
0 1 2 3 NaN
1 2 4 6 4.0
>>> # and to verify
>>> df.loc[df['F'] == 6, 'G'].item()
4.0
BTW我已经设法通过将DataFrame腌制成字符串来找到解决方法,但我对此没有任何好处:
df.loc[df['F'] == 6, 'G'] = pickle.dumps(df_in_df)
>>> df
187: D E F G
0 1 2 3 NaN
1 2 4 6 ccopy_reg\n_reconstructor\np0\n(cpandas.core.f...
>>> revive_df_from_df = pickle.loads(df.loc[df['F'] == 6, 'G'].item())
>>> revive_df_from_df
191: X Y Z
0 11 13 17
1 19 23 31
我在10分钟内通过大熊猫引用后开始使用大熊猫,所以我不知道约定,有什么更好的想法吗? 谢谢!
答案 0 :(得分:1)
首先创建一个Dict:
x = pd.DataFrame()
y = {'a':[5,4,5],'b':[6,9,7], 'c':[7,3,x]}
# {'a': [5, 4, 5], 'b': [6, 9, 7], 'c': [7, 3, Empty DataFrame
# Columns: []
# Index: []]}
z = pd.DataFrame(y)
# a b c
# 0 5 6 7
# 1 4 9 3
# 2 5 7 Empty DataFrame
# Columns: []
# Index: []
# In [ ]:
(或者,将DataFrame转换为dict并尝试插入它。有很多 发生,当熊猫创造物体时..你正在折磨熊猫。你的用例意味着嵌套的dicts,我会用它。 )
答案 1 :(得分:1)
依靠这种行为,你处于不稳定的状态。在将数组像事物传递给构造函数和赋值函数时,pandas尝试推断你的意思或想要做了很多工作。这似乎是故意压迫这些界限。
通过loc
进行直接分配似乎无效。这是我找到的一项工作。同样,我不期望这种行为在熊猫版本上更加强大。
df = pd.DataFrame([[1,2,3],[2,4,6]], columns=list('DEF'))
df_in_df = pd.DataFrame([[11,13,17],[19, 23, 31]], columns=list('XYZ'))
df.loc[df['F'] == 6, 'G'] = np.nan
df.loc[df['F'] == 6, 'G'] = df.loc[df['F'] == 6, ['G']].applymap(lambda x: df_in_df)
df
答案 2 :(得分:1)
首先创建要插入字典的列。 然后使用repr函数将字典转换为字符串。 然后将字符串字典插入到列中。 如果要查询该字符串。首先选择它,然后使用eval(dict)再次转换为字典并使用。