Pandas:将DataFrame对象存储在另一个DataFrame中,即嵌套的DataFrame

时间:2016-06-21 16:41:15

标签: python pandas dataframe

我想将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分钟内通过大熊猫引用后开始使用大熊猫,所以我不知道约定,有什么更好的想法吗? 谢谢!

3 个答案:

答案 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

enter image description here

答案 2 :(得分:1)

首先创建要插入字典的列。 然后使用repr函数将字典转换为字符串。 然后将字符串字典插入到列中。 如果要查询该字符串。首先选择它,然后使用eval(dict)再次转换为字典并使用。