Pandas 如何基于条件应用多个筛选条件,将其他列中的值复制到dataframe中的新列中
我想是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,但仅支持两个条件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']!='')
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,我很高兴能提供帮助!如果你觉得这是解决你问题的办法,如果你能接受我的回答,我将不胜感激。如果没有,我可以尝试改进它,如果你需要进一步的阐述。