将带有分层索引的Pandas系列连接回源DataFrame

时间:2012-08-09 14:41:06

标签: join group-by pandas ipython dataframe

我正试图将我的大脑包围在pandas数据结构中,并尝试在愤怒中使用它们。我已经发现groupby操作导致了一个pandas系列对象。但我无法弄清楚如何使用结果系列。特别是,我想做两件事:

1)将结果“加入”回初始DataFrame

2)根据分层索引从结果序列中选择一个特定值。

这是一个可以使用的玩具示例:

import pandas
df = pandas.DataFrame({'group1': ['a','a','a','b','b','b'],
                       'group2': ['c','c','d','d','d','e'],
                       'value1': [1.1,2,3,4,5,6],
                       'value2': [7.1,8,9,10,11,12]
})
dfGrouped = df.groupby( ["group1", "group2"] , sort=True)

## toy function, obviously not my real function
def fun(x): return mean(x**2)

results = dfGrouped.apply(lambda x: fun(x.value1))

所以得到的系列(结果)如下所示:

group1  group2
a       c          2.605
        d          9.000
b       d         20.500
        e         36.000

这是有道理的。但我该怎么做:

1)将其加入原始DataFrame df

2)选择一个值,例如group1 =='b'&组2 == 'd'

2 个答案:

答案 0 :(得分:8)

所以剩下#1。

In [9]: df
Out[9]:
  group1 group2  value1  value2
0      a      c     1.1     7.1
1      a      c     2.0     8.0
2      a      d     3.0     9.0
3      b      d     4.0    10.0
4      b      d     5.0    11.0
5      b      e     6.0    12.0

In [10]: results
Out[10]:
group1  group2
a       c          2.605
        d          9.000
b       d         20.500
        e         36.000

In [11]: df.set_index(['group1', 'group2'], inplace=True)['results'] = results

In [12]: df
Out[12]:
               value1  value2  results
group1 group2
a      c          1.1     7.1    2.605
       c          2.0     8.0    2.605
       d          3.0     9.0    9.000
b      d          4.0    10.0   20.500
       d          5.0    11.0   20.500
       e          6.0    12.0   36.000

In [13]: df.reset_index()
Out[13]:
  group1 group2  value1  value2  results
0      a      c     1.1     7.1    2.605
1      a      c     2.0     8.0    2.605
2      a      d     3.0     9.0    9.000
3      b      d     4.0    10.0   20.500
4      b      d     5.0    11.0   20.500
5      b      e     6.0    12.0   36.000

答案 1 :(得分:3)

在我周围的时候,我发现了#2的答案:

results["b","d"]给出了group1 =='b'&的值组2 == 'd'