创建一个新的Pandas分组对象

时间:2014-05-06 04:32:16

标签: python numpy pandas

在某些转换中,我似乎被迫从Pandas数据帧分组对象中断,我想要一种方法来返回该对象。

给定时间序列数据的数据帧,如果按数据帧中的一个值分组,我们将获得从键到数据帧的基础字典。 由于被迫从中创建Python字典,因此无法使用.from_dict()将结构转换回Dataframe,因为结构是数据帧的关键。 根据我的知识,回到Pandas没有一些hacky列重命名的唯一方法是将其转换回分组对象。 有没有办法做到这一点?

如果没有,我如何将实例字典转换为数据帧回到Pandas数据结构?

编辑添加样本::

rng = pd.date_range('1/1/2000', periods=10, freq='10m')
df = pd.DataFrame({'a':pd.Series(randn(len(rng)), index=rng), 'b':pd.Series(randn(len(rng)), index=rng)})
// now have dataframe with 'a's and 'b's in time series
for k, v in df.groupby('a'):
  df_dict[k] = v
// now we apply some transformation that cannot be applied view aggregate, transform, or apply
// how do we get this back into a groupedby object?

1 个答案:

答案 0 :(得分:0)

如果我正确理解OP的问题,您希望按某些键对数据帧进行分组,对每个组执行不同的操作(可能生成新列等),然后返回原始数据帧。

修改你的例子(按随机整数分组而不是通常唯一的浮点数):

np.random.seed(200)
rng = pd.date_range('1/1/2000', periods=10, freq='10m')
df = pd.DataFrame({'a':pd.Series(np.random.randn(len(rng)), index=rng), 'b':pd.Series(np.random.randn(len(rng)), index=rng)})
df['group'] = np.random.randint(3,size=(len(df)))

通常,如果我需要每组每列的单个值,我会这样做(例如,'a'的总和,'b'的平均值)

In [10]: df.groupby('group').aggregate({'a':np.sum, 'b':np.mean})
Out[10]: 
              a         b
group                    
0     -0.214635 -0.319007
1      0.711879  0.213481
2      1.111395  1.042313

[3 rows x 2 columns]

但是,如果我需要为每个组添加一个系列,

In [19]: def func(sub_df):
        sub_df['c'] = sub_df['a'] * sub_df['b'].shift(1)
        return sub_df
   ....: 

In [20]: df.groupby('group').apply(func)
Out[20]: 
                   a         b  group         c
2000-01-31 -1.450948  0.073249      0       NaN
2000-11-30  1.910953  1.303286      2       NaN
2001-09-30  0.711879  0.213481      1       NaN
2002-07-31 -0.247738  1.017349      2 -0.322874
2003-05-31  0.361466  1.911712      2  0.367737
2004-03-31 -0.032950 -0.529672      0 -0.002414
2005-01-31 -0.221347  1.842135      2 -0.423151
2005-11-30  0.477257 -1.057235      0 -0.252789
2006-09-30 -0.691939 -0.862916      2 -1.274646
2007-07-31  0.792006  0.237631      0 -0.837336

[10 rows x 4 columns]

我猜你想要第二个例子。但即使你的例子,原始问题也不是很清楚。