Pandas 如何基于条件应用多个筛选条件,将其他列中的值复制到dataframe中的新列中

Pandas 如何基于条件应用多个筛选条件,将其他列中的值复制到dataframe中的新列中,pandas,Pandas,我想是A、B、C、D、E、F i、 e如果列A='',则使新列G=C列,新列H=D列,新列i=e列 如果在A列中!=''和列B=='some value',使列G=0,列H=0,列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']!='')

我想是A、B、C、D、E、F i、 e如果列A='',则使新列G=C列,新列H=D列,新列i=e列 如果在A列中!=''和列B=='some value',使列G=0,列H=0,列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

我不确定您是否需要
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

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

?无法使用itI,我很高兴能提供帮助!如果你觉得这是解决你问题的办法,如果你能接受我的回答,我将不胜感激。如果没有,我可以尝试改进它,如果你需要进一步的阐述。