[英]Filtering and selecting dataframe in pandas using outcome of .groupby
[英]Pandas: DataFrame filtering using groupby and a function
使用Python 3.3和Pandas 0.10
我有一個通過連接多個CSV文件構建的DataFrame。 首先,我過濾掉Name列中包含特定字符串的所有值。 結果看起來像這樣(縮短為簡潔sakes,實際上有更多列):
Name ID
'A' 1
'B' 2
'C' 3
'C' 3
'E' 4
'F' 4
... ...
現在我的問題是我想刪除一個特殊的'重復'值。 我想刪除所有ID重復項(實際上是整行),其中映射到此ID的相應Name值不相似。 在上面的示例中,我想保留ID為1,2和3的行。其中ID = 4,Name值不相等,我想刪除它們。
我嘗試使用以下代碼行(基於此處的建議: 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!
編輯:
我沒有使用apply()
而是嘗試使用transform()
,但是這給了我錯誤: AttributeError: 'int' object has no attribute 'ndim'
。 非常感謝每個功能錯誤原因不同的解釋!
此外,我想在上面的例子中保持ID = 3的所有行。
提前謝謝,Matthijs
而不是長度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
更安全,在某些情況下這對我來說很麻煩。
您可以先刪除重復項:
In [11]: df = df.drop_duplicates()
In [12]: df
Out[12]:
Name ID
0 A 1
1 B 2
2 C 3
4 E 4
5 F 4
groupby
id並且僅考慮具有一個元素的那些:
In [13]: g = df.groupby('ID')
In [14]: size = (g.size() == 1)
In [15]: size
Out[15]:
ID
1 True
2 True
3 True
4 False
dtype: bool
In [16]: size[size].index
Out[16]: Int64Index([1, 2, 3], dtype=int64)
In [17]: df['ID'].isin(size[size].index)
Out[17]:
0 True
1 True
2 True
4 False
5 False
Name: ID, dtype: bool
和布爾索引由此:
In [18]: df[df['ID'].isin(size[size].index)]
Out[18]:
Name ID
0 A 1
1 B 2
2 C 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.