使用Python 3.3和Pandas 0.10
我有一个通过连接多个 CSV 文件构建的 DataFrame。首先,我过滤掉“名称”列中包含特定字符串的所有值。结果看起来像这样(为了简洁起见缩短了,实际上还有更多列):
Name ID
'A' 1
'B' 2
'C' 3
'C' 3
'E' 4
'F' 4
... ...
现在我的问题是我想删除“重复”值的特殊情况。我想删除所有 ID 重复项(实际上是整行),其中映射到该 ID 的相应名称值是not相似的。在上面的示例中,我想保留 ID 为 1、2 和 3 的行。当 ID=4 时,名称值不相等,我想删除它们。
我尝试使用以下代码行(基于此处的建议:Python Pandas:根据出现次数删除条目).
Code:
df[df.groupby('ID').apply(lambda g: len({x for x in g['Name']})) == 1]
但这给了我错误:ValueError: Item wrong length 51906 instead of 109565!
Edit:
而不是使用apply()
我也尝试过使用transform()
,但这给了我错误:AttributeError: 'int' object has no attribute 'ndim'
。非常感谢关于为什么每个函数的错误不同的解释!
另外,我想保留上面示例中 ID = 3 的所有行。
提前致谢,
马蒂斯
而不是长度len
,我认为您要考虑每个组中 Name 的唯一值的数量。使用nunique()
,并查看这个过滤组的巧妙方法。
df[df.groupby('ID').Name.transform(lambda x: x.nunique() == 1).astype('bool')]
如果你升级到pandas 0.12,你可以使用新的filter
群体方法,这使得这更加简洁和直接。
df.groupby('ID').filter(lambda x: x.Name.nunique() == 1)
一般性评论:当然,有时您确实想知道该组的长度,但我发现size
是一个比以下更安全的选择len
,在某些情况下这对我来说很麻烦。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)