![](/img/trans.png)
[英]More pythonic way to remove rows where one value begins by another row's value in a pandas dataframe
[英]What is the best way to remove all elements in a pandas dataframe where a value in one columns exists more than once in another column?
我有一個由幾棵樹組成的 DataFrame。 我想刪除在ToNode
列中多次出現RootNode
所有行。 但是, ToNode
的節點可以出現多次,如果它不是根節點。
這是 df 的一個例子。
ToNode | FromNode | Root
A None A
B A A
C None C
A C C
B A C
在這里,我想刪除Root == A
所有行,以便生成的 df 是
ToNode | FromNode | Root
C None C
A C C
B A C
實現此目的的一種方法(非常慢)如下:
root_list = list(df['Root'].unique())
for node in root_list:
if len(df[df['ToNode'] == node]) > 1:
df = df[df['Root'] != node]
我想有一種更快的方法,也許使用groupby()
和transform()
和/或map
/ apply
。
任何人都有關於如何加快速度的任何提示?
首先使用 groupby 找到所有出現>1
ToNode
並在Root
上過濾df
df2 = df.groupby(['ToNode'], as_index=False).count()
df[~df['Root'].isin(df2[df2['Root'] > 1]['ToNode'].unique())]
這給你以下結果。
ToNode FromNode Root
2 C None C
3 A C C
4 B A C
您可以嘗試以下操作。
value_counts
獲取計數>>> df.apply(pd.Series.value_counts, axis=1)[['A']] >= 2
A
0 True
1 True
2 False
3 False
4 False
>>> mask = df.apply(pd.Series.value_counts, axis=1)[['A']] >= 2
>>> mask[mask.A].index
Int64Index([0, 1], dtype='int64')
>>> idx = mask[mask.A].index
>>> df.drop(idx)
ToNode FromNode Root
2 C None C
3 A C C
4 B A C
您可以將Series.value_counts
和Series.isin
與布爾索引一起使用。 ~
這里是邏輯NOT
:
nodes_to_remove = df['ToNode'].value_counts()[lambda x: x > 1].index
#print(nodes_to_remove) Index(['A', 'B'], dtype='object')
df[~df['Root'].isin(nodes_to_remove)]
[出去]
ToNode FromNode Root
2 C None C
3 A C C
4 B A C
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.