簡體   English   中英

Python 數據框:刪除受多種條件影響的行

[英]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]

  • 將其與ab列進行比較,由於維度不匹配和 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM