在pandas中添加两列,具有不同的输出,具体取决于多个条件

时间:2017-10-24 01:03:33

标签: python pandas dataframe

假设我们必须关注pandas dataframe

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

我想在列A' A'中列出值。和' B'并加上一个逗号','在它们之间并将它放入一个新的列asd [' C']如果它们都是空的()。否则,如果另一个isnull()返回,或者返回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')

非常感谢任何帮助

2 个答案:

答案 0 :(得分:3)

使用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要求。

答案 1 :(得分:1)

我认为你可以这样做..

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