如何动态循环值以过滤数据帧?

2024-05-14 01:19:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要循环我的df.columns,这样我就可以通过循环动态地将条件应用于我的每一列,我不能在条件中循环我的列名

df:

   B1    B2    B3   B4   B5
   9     0     5    6    7
   8     7     6    4    8
   0     9     8    6    6
   1     0     7    6    3

condition = [(df['B1'] == 0)| (df['B1'].isnull==False),
             (df['B1'] == 8)| (df['B1'].isnull==True),
             (df['B1'] == 6)| (df['B1'].isnull==False)]

values = [999,444,555]

我曾经这样做过:

df['B1'] = np.select(condition , values) # Seperately for every column.

我正在努力:

for i in df.columns:
    df[i] = np.select(condition, values) # how can i able to loop i in condition, since condition is constant

B1的输出:

   B1    B2    B3   B4   B5
   999   0     5    6    7 
   999   7     6    4    8
   999   9     8    6    6
   999   0     7    6    3

Tags: columnsfalsedffornpcondition条件select
2条回答

您可以将字典传递给.eq(),以检查具有不同值的不同列的相等性:

>>> df.eq({'B1': 0, 'B2': 7, 'B3': 6, 'B4': 4, 'B5': 7})
      B1     B2     B3     B4     B5
0  False  False  False  False   True
1  False   True   True   True  False
2   True  False  False  False  False
3  False  False  False  False  False

类似地,您可以在.isna()之后执行此操作:

>>> df.isna().eq({'B1': False, 'B2': False, 'B3': True, 'B4': False, 'B5': False})
     B1    B2     B3    B4    B5
0  True  True  False  True  True
1  True  True  False  True  True
2  True  True  False  True  True
3  True  True  False  True  True 

然后最后将两者与|结合起来

一种可能的方法是使用^{},这将替换一个值,其中一个条件是True。如果你循环你的条件和价值观,我想你得到了你需要的

conditions = [(df == 0)| (df.isnull==False),
             (df == 8)| (df.isnull==True),
             (df == 6)| (df.isnull==False)]

values = [999,444,555]        
    
for condition, value in zip(conditions, values):
    df.mask(condition, value, inplace=True)

您的示例的输出如下

    B1   B2   B3   B4   B5
0    9  999    5  555    7
1  444    7  555    4  444
2  999    9  444  555  555
3    1  999    7  555    3

相关问题 更多 >