微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 保持Pandas中的行,其中相同的ID出现n次以上并转换为每个ID列表

我有一个如下所示的DataFrame:

     VID  value
1     1    xx
2     2    xx1
3     2    xx2
4     2    xx3
5     2    xx4
6     3    xx
7     3    xx
8     3    xx
9     4    zz1
10    4    zz2
11    4    zz3
12    4    zz4
13    4    zz5

我想只保留VID存在的行超过n = 3种情况.在上面的例子中,我只保留2-5和9-13行(因为只有VID 2和4出现的次数超过3次). “价值”字段无关紧要.

保留所需的行后,我想将我的数据转换为列表列表,同时在每个列的末尾附加一个“结束”值:

[[xx1, xx2, xx3, xx4, 'end'], [zz1, zz2, zz3, zz4, zz5, 'end']]

是否有可能在没有for循环的情况下获得上述内容

解决方法:

您可以按VID列进行分组,然后计算每个组的计数.然后使用它来索引原始df,以便只获取大于3的行数.示例 –

countdf = df.groupby('VID').count()
result = df.loc[df['VID'].isin(countdf[countdf['value'] > 3].index)]

演示 –

In [49]: df
Out[49]:
    VID value
1     1    xx
2     2   xx1
3     2   xx2
4     2   xx3
5     2   xx4
6     3    xx
7     3    xx
8     3    xx
9     4   zz1
10    4   zz2
11    4   zz3
12    4   zz4
13    4   zz5

In [51]: df.groupby('VID').count()
Out[51]:
     value
VID
1        1
2        4
3        3
4        5

In [52]: countdf = df.groupby('VID').count()

In [53]: df.loc[df['VID'].isin(countdf[countdf['value'] > 3].index)]
Out[53]:
    VID value
2     2   xx1
3     2   xx2
4     2   xx3
5     2   xx4
9     4   zz1
10    4   zz2
11    4   zz3
12    4   zz4
13    4   zz5

然后,您可以再次基于VID进行分组,然后将组转换为列表,然后再次转换为列表,示例 –

resultlist = result.groupby('VID')['value'].apply(list).tolist()

演示 –

In [54]: result = df.loc[df['VID'].isin(countdf[countdf['value'] > 3].index)]

In [55]: result.groupby('VID')['value'].apply(list).tolist()
Out[55]: [['xx1', 'xx2', 'xx3', 'xx4'], ['zz1', 'zz2', 'zz3', 'zz4', 'zz5']]

请注意,上面不会得到列表中的’结束’值,我猜这是没有必要的,但如果你真的想要,你可以在获得列表后手动添加它.示例 –

resultlist = [elem + ['end'] for elem in resultlist]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐