2016-06-21 168 views
0

我想存储一个DataFrame对象作为行的列的值: 下面是我想要实现的简化类比。熊猫:在另一个DataFrame中存储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对象作为新列的值。请参阅代码。

>>> 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我设法通过酸洗数据框成一个字符串,找到了一种解决方法,但我不觉得有什么好它:

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

这是很难理解什么是你要实现 - 你在说什么[面板](http://pandas.pydata.org/pandas-docs/stable/dsintro.html#面板)? – MaxU

+0

我想插入一个DataFrame对象到特定行的列。 – wolframalpha

+0

你为什么要这么做?熊猫被认为是一个快速的表格查询框架。 –

回答

1

你依靠这种行为在不稳固的基础上。在将数组传递给它的构造函数和赋值函数时,熊猫会做很多工作来试图推断出你的意思或想要的。这似乎有意地迫在眉睫。

似乎通过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

+0

为什么按照惯例将DF插入另一个DF是否有错? – wolframalpha

+0

因为在初始熊猫叫Numpy - 创建数组..现在它的顺序。 @wolframalpha ..你的用例不是熊猫设计的。 – Merlin

+1

我不是这个问题的权威。但我会说是的。没有错。但按惯例错误(我猜这是什么意思)。熊猫提供的优势有很多种形式,包括它的推论。在数据框中放置一个通用对象应该不是问题。期待这个代码在未来的版本中继续运行。我猜想开发者可能会很好地改变它的工作方式,试图更好地推断人们在尝试这样的事情时可能意味着什么。使用MultiIndex可以更好地处理高维结构中的高维结构。 – piRSquared

1

首先创建一个快译通:

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 [ ]: 

(或转换数据框与dict,并尝试将其插入有发生很多 ,当熊猫创建一个对象..你折磨大熊猫您使用。案例意味着嵌套的字典,我会用它。)

+0

是的,没错,谢谢,但我想创建一个新的列,然后在行中插入一个DataFrame!任何想法? – wolframalpha

+0

是的,那会更好! – wolframalpha

+0

您打算通过熊猫方法访问插入的DF吗?它可能不会工作。使用链表 - 或字典和熊猫或只是使用Sqlite--折磨熊猫这种方式将导致未来重写 – Merlin