簡體   English   中英

pandas-按列名遮罩數據框

[英]pandas - mask dataframe by column name

從這個簡單的數據框df

col1,col2
1,3
2,1
3,8

我想在列名的函數中應用一個布爾mask 我知道價值觀很容易:

mask = df <= 1

df = df[mask]

返回:

面具:

    col1   col2
0   True  False
1  False   True
2  False  False

df:

   col1  col2
0     1   NaN
1   NaN     1
2   NaN   NaN

如預期的那樣。 現在,我想根據列名獲取一個布爾掩碼,例如:

mask = df == df['col_1']

應該返回:

面具

    col1   col2
0   True  False
1   True  False
2   True  False

編輯:

這似乎很奇怪,但是我需要使用這些掩碼,以便以后通過列seaborn熱圖進行過濾。

如評論中所述,在這種情況下,您將需要獲得類似“蒙版”的情況似乎很少見(而且很可能您不在其中之一)。 因此,在Pandas中可能沒有適合他們的好的“內置”解決方案。

但是,您可以使用如下所示的hack來實現所需的功能:

mask = (df == df) & (df.columns == 'col_1')

更新: 如注釋中所述,如果您的數據幀包含空值,則以這種方式計算的掩碼在相應位置將始終為False 如果這是一個問題,更安全的選擇是:

mask = ((df == df) | df.isnull()) & (df.columns == 'col_1')

您可以轉置數據框,然后將其與列進行比較,然后轉回。 有點奇怪但可行的示例:

import pandas as pd
from io import StringIO

data = """
col1,col2
1,3
2,1
3,8
"""

df = pd.read_csv(StringIO(data))
mask = (df.T == df['col1']).T

In [176]: df
Out[176]:
   col1  col2
0     1     3
1     2     1
2     3     8


In [178]: mask
Out[178]:
   col1   col2
0  True  False
1  True  False
2  True  False

編輯

我為此找到了另一個答案,您可以使用isin方法:

In [41]: df.isin(df.col1)
Out[41]:
   col1   col2
0  True  False
1  True  False
2  True  False

編輯2

如@DSM在注釋中所示,這兩種情況無法正常工作。 因此,您應該使用@KT。 方法。 但是..讓我們更多地使用移調:

df.col2 = df.col1

In [149]: df
Out[149]:
   col1  col2
0     1     1
1     2     2
2     3     3

In [147]: df.isin(df.T[df.columns == 'col1'].T)
Out[147]:
   col1   col2
0  True  False
1  True  False
2  True  False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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