我有一组行,我想根据标识符的值进行分组 - 存在于每一行中 - 然后对将成为其结果的组进行进一步的隔离处理。
我的数据框如下所示:
foreach ($positions['data'] as $position) {
echo $position['title'];
}
如果我按In [50]: df
Out[50]:
groupkey b c d e date
0 C1 b1 c1 d1 e1 2014-10-26 12:13:14
1 C2 NaN c2 d2 e2 2014-11-02 12:13:14
2 C1 b3 c3 d3 e3 2014-11-09 12:13:14
3 C1 b4 NaN d4 e4 2014-11-16 12:13:14
4 C3 b5 c5 d5 e5 2014-11-23 12:13:14
5 C2 b6 c6 d6 e6 2014-11-30 12:13:14
进行分组,我知道我应该处理groupkey
返回的地址:
GroupBy
但是,在分组之前以及为了减少数据集大小的并行目的,我想不考虑每组只有一条记录的任何行(如果以上述方式分组)。
在我的示例中,这意味着应该省略行>> df.groupby('groupkey')
。
现在,在我看来,计算每组记录的最简单方法当然需要首先进行分组,然后对记录进行计数,如下:
4
我想我可以这样做,然后删除只有一条记录的组。
我不知道如何解决此问题,而无需手动返回并删除仅包含一条记录的组。
我想知道是否可以通过某种功能进行分组,以便在分组时考虑这一条件?
感谢您的帮助
答案 0 :(得分:2)
我认为您可以先使用value_counts
map
和boolean indexing
按filter
过滤DataFrame
:
print df.groupkey.value_counts() != 1
C1 True
C2 True
C3 False
Name: groupkey, dtype: bool
print df.groupkey.map(df.groupkey.value_counts() != 1)
0 True
1 True
2 True
3 True
4 False
5 True
Name: groupkey, dtype: bool
print df[df.groupkey.map(df.groupkey.value_counts() != 1)]
groupkey b c d e date
0 C1 b1 c1 d1 e1 2014-10-26 12:13:14
1 C2 NaN c2 d2 e2 2014-11-02 12:13:14
2 C1 b3 c3 d3 e3 2014-11-09 12:13:14
3 C1 b4 NaN d4 e4 2014-11-16 12:13:14
5 C2 b6 c6 d6 e6 2014-11-30 12:13:14
有趣的是,它更快{{3}}解决方案(len(df)=6k
):
df = pd.concat([df]*1000).reset_index(drop=True)
In [21]: %timeit df[df.groupkey.map(df.groupkey.value_counts() != 1)]
1000 loops, best of 3: 1.87 ms per loop
In [22]: %timeit df.groupby('groupkey').filter(lambda x: len(x) != 1)
100 loops, best of 3: 2.71 ms per loop
答案 1 :(得分:1)
您想在群组中使用groupby
filter
len
对象:
In [9]:
df.groupby('groupkey').filter(lambda x: len(x) > 1)
Out[9]:
groupkey b c d e date
0 C1 b1 c1 d1 e1 2014-10-26 12:13:14
1 C2 NaN c2 d2 e2 2014-11-02 12:13:14
2 C1 b3 c3 d3 e3 2014-11-09 12:13:14
3 C1 b4 NaN d4 e4 2014-11-16 12:13:14
5 C2 b6 c6 d6 e6 2014-11-30 12:13:14