在 pandas 中添加两列,根据多个条件输出不同的内容

Add two columns in pandas with different output depending on multiple conditions

假设我们必须遵循 pandas 数据帧

asd = pd.DataFrame({'A':['a', 'b', np.nan, 'c', np.nan], 'B':['f', np.nan, 'u', 'i', np.nan]})

我想连接 'A' 和 'B' 列中的值并在它们之间放置一个逗号 ',' 并将其放入新列 asd['C'] 如果它们都是 notnull()。否则 return 如果另一个是 null(),或者 return np.nan 如果两者都是 null() 那么列 'C' 的最终结果将是

asd['C'] = ['a, f', 'b', 'u', 'c, i', np.nan]

我尝试了以下方法

def f(asd):
if asd['A'].notnull() & asd['B'].notnull():
    asd['C'] = asd['A'] + ', ' + asd['B']
elif asd['A'].notnull() & asd['B'].isnull():
    asd['C'] = asd['A']
elif asd['A'].isnull() & asd['B'].notnull():
    asd['C'] = asd['B']
else:
    asd['C'] = np.nan
return asd['C']

asd['C'] = asd.apply(f, axis=1)

但它给我以下错误

("'str' object has no attribute 'notnull'", 'occurred at index 0')

非常感谢任何帮助

使用apply + str.join:

df.apply(lambda x: ', '.join(x.dropna()), 1).replace('', np.nan)

0    a, f
1       b
2       u
3    c, i
4     NaN
dtype: object

最后的 replace 调用处理您的 np.nan 要求。

我认为你可以这样做..

df['C']=df.stack().groupby(level=0).apply(','.join)
df
Out[459]: 
     A    B    C
0    a    f  a,f
1    b  NaN    b
2  NaN    u    u
3    c    i  c,i
4  NaN  NaN  NaN

添加时间:

小数据集:

%timeit df.apply(lambda x: ', '.join(x.dropna()), 1).replace('', np.nan)
1000 loops, best of 3: 1.6 ms per loop
%timeit df.stack().groupby(level=0).apply(','.join)
1000 loops, best of 3: 1.41 ms per loop

大数据集(都慢)

df=pd.concat([df]*1000,axis=1)
df=pd.concat([df]*1000,axis=0)
%timeit df.apply(lambda x: ', '.join(x.dropna()), 1).replace('', np.nan)
1 loop, best of 3: 2.1 s per loop
%timeit df.stack().groupby(level=0).apply(','.join)
1 loop, best of 3: 1.23 s per loop