使用Python 3.3和Pandas 0.10
我有一个由多个CSV文件连接而成的DataFrame。首先,我过滤掉Name列中包含特定字符串的所有值。结果看起来像这样(为简洁起见缩短了内容,实际上还有更多列):
现在我的问题是,我想要删除一种特殊情况的“重复”值。 我想要删除所有ID重复(实际上是整行)的记录,其中映射到此ID的相应Name值不相似。 在上面的示例中,我希望保留ID为1、2和3的行。 当ID = 4时,名称值是不相等的,我想要删除这些行。
我尝试使用以下代码行(基于此处的建议:Python Pandas:根据出现次数删除条目)。
代码:
然而,这给了我一个错误:
我还尝试使用
此外,我想保留上面示例中ID = 3的所有行。
提前致谢, Matthijs
我有一个由多个CSV文件连接而成的DataFrame。首先,我过滤掉Name列中包含特定字符串的所有值。结果看起来像这样(为简洁起见缩短了内容,实际上还有更多列):
Name ID
'A' 1
'B' 2
'C' 3
'C' 3
'E' 4
'F' 4
... ...
现在我的问题是,我想要删除一种特殊情况的“重复”值。 我想要删除所有ID重复(实际上是整行)的记录,其中映射到此ID的相应Name值不相似。 在上面的示例中,我希望保留ID为1、2和3的行。 当ID = 4时,名称值是不相等的,我想要删除这些行。
我尝试使用以下代码行(基于此处的建议:Python Pandas:根据出现次数删除条目)。
代码:
df[df.groupby('ID').apply(lambda g: len({x for x in g['Name']})) == 1]
然而,这给了我一个错误:
ValueError: Item wrong length 51906 instead of 109565!
编辑:我还尝试使用
transform()
,但是这给了我一个错误:AttributeError: 'int' object has no attribute 'ndim'
。非常感谢有关为什么每个函数的错误不同的解释!此外,我想保留上面示例中ID = 3的所有行。
提前致谢, Matthijs
nunique()
,所以感谢你指出来。实际上,你能简要描述一下为什么你使用transform()
而不是apply()
吗? - Matthijsapply
将返回一个较短的Series,每个组只有一个条目。相反,我们希望得到与原始Series相同长度的Series,其中每个组的整个内容都映射为“True”或“False”块。然后,我们可以使用该布尔Series来屏蔽原始Series。有关更多信息,请参见文档。 - Dan Allantransform()
和apply()
的解释! - Matthijs