删除生成数据帧的groupby-apply函数的无关索引

时间:2016-05-06 17:54:21

标签: python pandas

这是我在各种情况下遇到的问题,如果我做错了,或者我的整个方法都没有,我很好奇。这里的特定数据/功能并不重要,但我会在任何情况下都包含一个具体的例子。

希望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的分组函数是不好的形式?如果是这样,获得相同结果的正确方法是什么? (同样,这是一个适合此类问题的一般性问题)

2 个答案:

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