[英]Deleting dataFrame row in Pandas if a combination of column values equals a tuple in a list
我目前這樣做是為了刪除列表removal_list
中具有特定列'some_column'
值的removal_list
df = df[~df['some_column'].isin(removal_list)]
如果我想比較元組列表中的值組合,我該怎么做? (如果有更好的方法可以實現這一點,則不一定需要是元組列表)
例如:
removal_list = [(item1,store1),(item2,store1),(item2,store2)]
如果df['column_1']
和df['column_2']
的特定行的具有值item1
和store1
(或任何其他元組removal_list
),然后刪除該行
另外,可能需要評估兩列以上的列
編輯更好的例子:
client account_type description
0 1 2 photographer
1 2 2 banker
2 3 3 banker
3 4 2 journalist
4 5 4 journalist
remove_list = [(2,journalist),(3,banker)]
檢查列account_type
和description
輸出:
client account_type description
0 1 2 photographer
1 2 2 banker
4 5 4 journalist
說你有
removal_list = [(item1,store1),(item2,store1),(item2,store2)]
然后
df[['column_1', 'column_2']].apply(tuple, axis=1)
應該創建一系列元組,等等
df[['column_1', 'column_2']].apply(tuple, axis=1).isin(removal_list)
是你所追求的二元條件。 刪除與以前一樣。 這適用於任意數量的列。
例
df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
>>> df[['a', 'b']].apply(tuple, axis=1).isin([(1, 3), (30, 40)])
0 (1, 3)
1 (2, 4)
dtype: object
我建議創建DataFrame
並與默認的內部DataFrame
merge
:
remove_list = [(2,'journalist'),(3,'banker')]
df1 = pd.DataFrame(remove_list, columns=['account_type','description'])
print (df1)
account_type description
0 2 journalist
1 3 banker
df = df.merge(df1, how='outer', indicator=True).query('_merge != "both"').drop('_merge', 1)
print (df)
client account_type description
0 1 2 photographer
1 2 2 banker
4 5 4 journalist
一種方法是從壓縮2列創建一個系列,然后使用布爾索引。 我還建議您使用set
而不是list
進行O(1)查找。
remove_set = {(2,'journalist'),(3,'banker')}
condition = pd.Series(list(zip(df.account_type, df.description))).isin(remove_set)
res = df[~condition]
print(res)
client account_type description
0 1 2 photographer
1 2 2 banker
4 5 4 journalist
如果索引設置為['account_type', 'description']
,我們可以使用drop
方法。
df.set_index(['account_type', 'description']).drop(remove_list).reset_index()
account_type description client
0 2 photographer 1
1 2 banker 2
2 4 journalist 5
您可以使用帶有額外列的查詢方法來進行選擇。
removal_list = [(item1,store1),(item2,store1),(item2,store2)]
df['removal_column'] = df.apply(lambda x: (x.account_type, x.description), axis='columns')
df = df.query('removal_column not in @removal_list').drop('removal_column', axis='columns')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.