这是我在各种情况下遇到的问题,如果我做错了,或者我的整个方法都没有,我很好奇。这里的特定数据/功能并不重要,但我会在任何情况下都包含一个具体的例子。
希望groupby / apply在每个组上执行各种操作并返回新的数据帧并不罕见。一个例子可能是这样的:
def patch_stats(df):
first = df.iloc[0]
diversity = (len(df['artist_id'].unique())/float(len(df))) * df['dist'].mean()
start = first['ts']
return pd.DataFrame({'diversity':[diversity],'start':[start]})
因此,这是一个分组函数,它生成一个包含两列的新DataFrame,每列都来自对输入数据的不同操作。同样,具体细节在这里并不重要,但问题在于:
当我查看输出时,我会得到这样的结果:
result = df.groupby('patch_idx').apply(patch_stats)
print result
diversity start
patch_idx
0 0 0.876161 2007-02-24 22:54:28
1 0 0.588997 2007-02-25 01:55:39
2 0 0.655306 2007-02-25 04:27:05
3 0 0.986047 2007-02-25 05:37:58
4 0 0.997020 2007-02-25 06:27:08
5 0 0.639499 2007-02-25 17:40:56
6 0 0.687874 2007-02-26 05:24:11
7 0 0.003714 2007-02-26 07:07:20
8 0 0.065533 2007-02-26 09:01:11
9 0 0.000000 2007-02-26 19:23:52
10 0 0.068846 2007-02-26 20:43:03
...
这一切都很好,除了我有一个我不想要的无关,无名的索引级别:
print result.index.names
FrozenList([u'patch_idx', None])
现在,这不是一个大问题;我总是可以通过以下方式摆脱无关的索引级别:
result = result.reset_index(level=1,drop=True)
但是看看这是怎么出现的,我有分组函数返回一个DataFrame,我想知道是否有更好的方法来解决这个问题。使用返回DataFrame的分组函数是不好的形式?如果是这样,获得相同结果的正确方法是什么? (同样,这是一个适合此类问题的一般性问题)
答案 0 :(得分:1)
在分组功能中,返回Series
而不是DataFrame
。具体来说,将patch_stats
的最后一行替换为:
return pd.Series({'diversity':diversity, 'start':start})
答案 1 :(得分:0)
我遇到了同样的问题。
result = df.groupby('patch_idx', group_keys=False).apply(patch_stats)
print result