我有两个文本列 A 和 B。我想采用第一个非空字符串,或者如果 A 和 B 都有值,则采用 A 中的值。C 是我试图创建的列:import pandas as pdcols = ['A','B']data = [['data','data'], ['','data'], ['',''], ['data1','data2']]df = pd.DataFrame.from_records(data=data, columns=cols) A B0 data data1 data2 3 data1 data2我的尝试:df['C'] = df[cols].apply(lambda row: sorted([val if val else '' for val in row], reverse=True)[0], axis=1) #Reverse sort to avoid picking an empty string A B C0 data data data1 data data2 3 data1 data2 data2 #I want data1 here预期输出: A B C0 data data data1 data data2 3 data1 data2 data1我想我想要 pandas 相当于 SQL 合并。
2 回答
![?](http://img1.sycdn.imooc.com/5333a1d100010c2602000200-100-100.jpg)
饮歌长啸
TA贡献1951条经验 获得超3个赞
您还可以使用numpy.where
:
In [1022]: import numpy as np
In [1023]: df['C'] = np.where(df['A'].eq(''), df['B'], df['A'])
In [1024]: df
Out[1024]:
A B C
0 data data data
1 data data
2
3 data1 data2 data1
![?](http://img1.sycdn.imooc.com/533e4c9c0001975102200220-100-100.jpg)
跃然一笑
TA贡献1826条经验 获得超6个赞
让我们尝试一下idxmax+ lookup:
df['C'] = df.lookup(df.index, df.ne('').idxmax(1))
或者您可以使用Series.where:
df['C'] = df['A'].where(lambda x: x.ne(''), df['B'])
A B C
0 data data data
1 data data
2
3 data1 data2 data1
添加回答
举报
0/150
提交
取消