我在熊猫中有以下数据框:
id name categoryids shops
5 239 Boulanger [5] 152
3 196 Bouygues Telecom [5] 500
4 122 Darty [5,3] 363
1 311 Electro Dépôt [5] 81
0 2336 Orange [15] 578
2 194 Orange [5] 577
我想删除第 5 行,因为它在名称上重复,但在categoryids列中具有不同的值,但由于这些值是数组(因为它们可以有多个值),我在比较它们时遇到问题。
我的想法是检查此列的模式并丢弃其数组中没有此值的所有行(例如,在这种情况下,模式将为 5,因此应丢弃第 5 列,因为此值不是存在于其数组中),但我在计算此值时遇到问题,因为该列是一个数组,而不是单个值。
关于如何做到这一点的任何想法或建议?
我正在使用 python 3.7 和最新版本的熊猫。
谢谢你。
使用这样的 DataFrame:
df = pd.DataFrame({'id': [239,196,122,311,2336,194,],
'name': ['Boulanger','Bouygues Telecom','Darty','Electro Dépôt','Orange','Orange',],
'shops': [152, 500, 363, 81, 578, 577,],
'categoryids': [[5],[5],[5,3],[5],[15],[5],]})
你可以做:
df.sort_values('categoryids').drop_duplicates('name', keep='first')
它对categoryids
列进行排序,然后将重复项放入name
并保留其中的第一个。
编辑:
您可以做的另一件事是检查categoryids
列中您所追求的值是否存在:
df["exist"] = [int(5 in r) for r in df["categoryids"]]
这会给你:
id name shops categoryids exist
0 239 Boulanger 152 [5] 1
1 196 Bouygues Telecom 500 [5] 1
2 122 Darty 363 [5, 3] 1
3 311 Electro Dépôt 81 [5] 1
4 2336 Orange 578 [15] 0
5 194 Orange 577 [5] 1
然后你只能取那些存在的:
df[df['exist'] == 1]
然后使用pd.duplicated()
@Erfan 提到的方法找到重复项:
df['dups'] = df['name'].duplicated(keep=False).astype(int)
id name shops categoryids exist dups
0 239 Boulanger 152 [5] 1 0
1 196 Bouygues Telecom 500 [5] 1 0
2 122 Darty 363 [5, 3] 1 0
3 311 Electro Dépôt 81 [5] 1 0
4 2336 Orange 578 [15] 0 1
5 194 Orange 577 [5] 1 1
df[(
(df['dups']!=1) |
(df['exist']!=0)
)].drop(['exist', 'dups'], axis=1).reset_index()
会导致:
index id name shops categoryids
0 0 239 Boulanger 152 [5]
1 1 196 Bouygues Telecom 500 [5]
2 2 122 Darty 363 [5, 3]
3 3 311 Electro Dépôt 81 [5]
4 5 194 Orange 577 [5]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句