数据框行上的Lambda与列进行交互

时间:2019-02-24 11:38:06

标签: python pandas lambda

我正在尝试将此应用于我的数据框: 对于每一行:

  • 如果row ['colA'] =='NONE',则row ['colA'] = row ['colX']
  • elif row ['colA']!='NONE'&row ['colB'] =='NONE',然后row ['colB'] = row ['colX']

,依此类推。我正在尝试使用lambda函数来做到这一点,以便:

dataframe.apply(lambda row: row['colA']=row['result'] if row['colA']=='NONE' else (row['colB']=row['result'] if row['colA']!='NONE' & row['colB']!='NONE'),axis=0)

但是当然不起作用。有没有办法做类似的事情?如果不能,我可以逐列应用迭代逻辑来解决这个问题,但我想知道是否有更快的方法。

谢谢

2 个答案:

答案 0 :(得分:1)

可能是这样的(总是发布一些示例数据进行测试):

df=df.replace('NONE',np.nan)
df['colA']=df['colA'].fillna(df['colX'])
df['colB']=np.where(df['colA'].notnull()&df['colB'].isnull(),df['colB'].fillna(df['colX']),df['colB'])
#alternative for above line->
#df.loc[df.colA.notnull()&df.colB.isnull(),'colB']=df.loc[df.colA.notnull()&df.colB.isnull(),'colB'].fillna(df['colX'])

答案 1 :(得分:0)

如果NONEstring的布尔掩码比较,则~是反掩码,并通过loc设置值:

df = pd.DataFrame({'colA':['NONE', 'A', 'NONE', 'D'],
                   'colB':['NONE', 'B', 'C', 'NONE'],
                   'colX':['a','b','c','d']})
print (df)
   colA  colB colX
0  NONE  NONE    a
1     A     B    b
2  NONE     C    c
3     D  NONE    d

m1 = df['colA']=='NONE'
m2 = ~m1 & (df['colB']=='NONE')

df.loc[m1, 'colA'] = df.loc[m1, 'colX']
df.loc[m2, 'colB'] = df.loc[m2, 'colX'] 
print (df)
  colA  colB colX
0    a  NONE    a
1    A     B    b
2    c     C    c
3    D     d    d

如果NONENoneNaN(缺少值),请更改布尔掩码:

df = pd.DataFrame({'colA':[None, 'A',None, 'D'],
                   'colB':[None, 'B', 'C', None],
                   'colX':['a','b','c','d']})
print (df)
   colA  colB colX
0  None  None    a
1     A     B    b
2  None     C    c
3     D  None    d

m1 = df['colA'].isnull()
m2 = ~m1 & df['colB'].isnull()

df.loc[m1, 'colA'] = df.loc[m1, 'colX']
df.loc[m2, 'colB'] = df.loc[m2, 'colX'] 
print (df)
  colA  colB colX
0    a  None    a
1    A     B    b
2    c     C    c
3    D     d    d