首页 > 解决方案 > 如何根据条件应用多个过滤条件以将其他列中的值复制到熊猫数据框中的新列中

问题描述

我假设 cols: A,B,C,D,E,F 即如果在 col A == '' 中,则使 new col G = col C,new col H = col D,new col I = col E if in col A !='' & col B == 'some-value' ,make col G=0,col H=0, col I=0.. 尝试使用 np.where 但它只支持两个条件。

def change(dfr):

  if (dfr['A']==''): 
    dfr['G'] = dfr['A']
    dfr['H'] = dfr['B']
    dfr['I'] = dfr['C']
  if ((dfr['A']!='') & (dfr['B']=='some-value')): 
    dfr['G'] = dfr['A']
    dfr['H'] = dfr['B']
    dfr['I'] = dfr['C']
  if ((dfr['A']!='') & (dfr['B']=='value')):
    dfr['G'] = 0
    dfr['H'] = 0
    dfr['I'] = 0

标签: pandas

解决方案


我不确定你是否需要这些if陈述。您可以使用.loc来完成此操作。这是一个玩具数据框:

data = pd.DataFrame({"A" : ['a', '', 'f', '4', '', 'z'],
                    "B" : ['f', 'y', 't', 'u', 'o', '1'],
                    "C" : ['a', 'b', 'c', 'd', 'e', 'f'],                   
                    "G" : [1, 1, 1, 1, 1, 1],
                    'H' : [6, 6, 6, 6, 6, 6],
                    "I" : ['q', 'q', 'q', 'q', 'q', 'q']})

data

   A  B  C  G  H  I
0  a  f  a  1  6  q
1     y  b  1  6  q
2  f  t  c  1  6  q
3  4  u  d  1  6  q
4     o  e  1  6  q
5  z  1  f  1  6  q

为您要在 B 列中检查的值构建几个参数可能是有意义的:

def change(dfr, b_firstvalue, b_secondvalue):  
    new_df = dfr.copy()
    new_df.loc[new_df['A']=='', 'G'] = new_df['A'] 
    new_df.loc[new_df['A']=='', 'H'] = new_df['B']
    new_df.loc[new_df['A']=='', 'I'] = new_df['C']

    new_df.loc[((new_df['A']!='') & (new_df['B'] == b_firstvalue)), 'G'] = new_df['A']
    new_df.loc[((new_df['A']!='') & (new_df['B'] == b_firstvalue)), 'H'] = new_df['B']
    new_df.loc[((new_df['A']!='') & (new_df['B'] == b_firstvalue)), 'I'] = new_df['C']

    new_df.loc[((new_df['A']!='') & (new_df['B'] == b_secondvalue)), 'G'] = 0
    new_df.loc[((new_df['A']!='') & (new_df['B'] == b_secondvalue)), 'H'] = 0
    new_df.loc[((new_df['A']!='') & (new_df['B'] == b_secondvalue)), 'I'] = 0
    return new_df

data2 = change(data, '1', 'f')

data2

   A  B  C  G  H  I
0  a  f  a  0  0  0
1     y  b     y  b
2  f  t  c  1  6  q
3  4  u  d  1  6  q
4     o  e     o  e
5  z  1  f  z  1  f

显然,该函数将取决于您要处理的列数。这只是示例问题的解决方案。如果您想用更多列替换值,则可能有更有效的处理方法。


推荐阅读