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 管道中可能是有利的
我想在 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 管道中可能是有利的