[英]Python dataframe: Dropping rows subject to multiple conditions
假設我有以下(示例)數據框:
a b c d e
0 9 9 0 9 9
1 1 2 1 9 9
2 8 8 0 2 3
3 7 7 0 7 8
4 1 2 0 3 4
5 6 2 3 6 6
6 1 2 0 1 2
7 1 3 0 1 2
還假設我已經生成了一個(任意的)索引列表,例如 [3,4]。 對於列表中的每個元素,我想從數據框中刪除與第 3 行和第 4 行在“a”列和“b”列中具有相同值的所有行。
由於第 3 行有 a=7 和 b=7,沒有其他行有 a=7 和 b=7,因此只有第 3 行被刪除。
由於第 4 行有 a=1 和 b=2,第 1 行和第 6 行也有 a=1 和 b=2,因此我刪除了第 4、1 和 6 行。
因此生成的數據框將如下所示:
a b c d e
0 9 9 0 9 9
1 8 8 0 2 3
2 6 2 3 6 6
3 1 3 0 1 2
有誰知道如何想出一個解決方案來快速做到這一點(用於更大的數據框)? 謝謝你。
利用numpy
廣播;
使用loc
提取索引和列處的值並將其重塑為 3d 數組:
df.loc[indices,cols].values[:,None]
將其與a
和b
列進行比較,由於維度不匹配和 numpy 廣播,這會將第 3 行和第 4 行與所有其他行進行比較
df[cols].values == df.loc[indices,cols].values[:,None]
使用.all(2)
確保兩列匹配,使用any(0)
獲取第 3 行或第 4 行的匹配
否定~
並刪除匹配的行
給出:
indices = [3,4]
cols = ['a','b']
df[~(df[cols].values == df.loc[indices,cols].values[:,None]).all(2).any(0)]
# a b c d e
#0 9 9 0 9 9
#2 8 8 0 2 3
#5 6 2 3 6 6
#7 1 3 0 1 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.