如何将前置条件应用于GroupBy或如何忽略GroupBy中具有一个记录的组

时间:2016-04-29 09:16:15

标签: python pandas

我有一组行,我想根据标识符的值进行分组 - 存在于每一行中 - 然后对将成为其结果的组进行进一步的隔离处理。

我的数据框如下所示:

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

我想我可以这样做,然后删除只有一条记录的组。

  1. 我不知道如何解决此问题,而无需手动返回并删除仅包含一条记录的组。

  2. 我想知道是否可以通过某种功能进行分组,以便在分组时考虑这一条件?

  3. 感谢您的帮助

2 个答案:

答案 0 :(得分:2)

我认为您可以先使用value_counts mapboolean indexingfilter过滤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