Pandas 添加一列并使用列表推导式填充值 if else

Pandas add a column and fill values by using list comprehension if else

我想在 df 中添加列名 A,并填充值。如果 a1 列有值,则用 df.a1 填充 df.A,否则用 df.a2 填充 df.A。

tm = pd.DataFrame({'a1':['astr1',np.nan,'astr2',np.nan],'a2':[np.nan,np.nan,np.nan,'astr3']})
tm

    a1      a2
0   str1    NaN
1   NaN     NaN
2   str2    NaN
3   NaN     str2

我想要这个。

    a1      a2       A
0   str1    NaN      str1
1   NaN     NaN      NaN
2   str2    NaN      str2
3   NaN     str2     str2

您可以使用 numpy.where with mask created by isnull:

tm['A'] = np.where(tm.a1.isnull(), tm.a2, tm.a1)
print (tm)

      a1     a2      A
0  astr1    NaN  astr1
1    NaN    NaN    NaN
2  astr2    NaN  astr2
3    NaN  astr3  astr3

另一个解决方案combine_first or fillna

tm['A'] = tm.a1.combine_first(tm.a2)
print (tm)
      a1     a2      A
0  astr1    NaN  astr1
1    NaN    NaN    NaN
2  astr2    NaN  astr2
3    NaN  astr3  astr3

tm['A'] = tm.a1.fillna(tm.a2)
print (tm)
      a1     a2      A
0  astr1    NaN  astr1
1    NaN    NaN    NaN
2  astr2    NaN  astr2
3    NaN  astr3  astr3

最后一个解决方案update

tm['A'] = tm.a1
tm.A.update(tm.a2)
print (tm)
      a1     a2      A
0  astr1    NaN  astr1
1    NaN    NaN    NaN
2  astr2    NaN  astr2
3    NaN  astr3  astr3

除了jezraels的回答,你还可以使用pandas assign function。 例如,他的 fillna 解决方案可能会以

形式重铸
tm.assign(A = lambda x:x.a1.fillna(x.a2))

这在 pandas 管道中可能是有利的