Python 根据多个条件,在熊猫中添加两列具有不同输出的列

Python 根据多个条件,在熊猫中添加两列具有不同输出的列,python,pandas,dataframe,Python,Pandas,Dataframe,假设我们必须跟踪数据帧 asd = pd.DataFrame({'A':['a', 'b', np.nan, 'c', np.nan], 'B':['f', np.nan, 'u', 'i', np.nan]}) 我想将列“A”和“B”中的值连在一起,并在它们之间加上逗号“,”,如果它们都不为null,则将其放入新的列asd['C']。否则,如果另一个为null,则返回np.nan;如果两者都为null,则返回np.nan,因此列“C”的最终结果为 asd['C'] = ['a, f', 'b

假设我们必须跟踪数据帧

asd = pd.DataFrame({'A':['a', 'b', np.nan, 'c', np.nan], 'B':['f', np.nan, 'u', 'i', np.nan]})
我想将列“A”和“B”中的值连在一起,并在它们之间加上逗号“,”,如果它们都不为null,则将其放入新的列asd['C']。否则,如果另一个为null,则返回np.nan;如果两者都为null,则返回np.nan,因此列“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:

最后的替换调用处理您的np.nan需求

使用apply+str.join:


最后的替换调用处理您的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

我想你可以这样做

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

它工作得很好,一次又一次地谢谢你@COLDSPEED你为我省了很多钱time@MartinHeusen别担心。我只是有点失望,pandas不支持子片间的str方法,或者这可能会加快很多。是的,我知道,应用功能总是会减慢速度,特别是在处理像我正在处理的问题这样的有1000万行的数据帧时。@cᴏʟᴅsᴘᴇᴇᴅ 添加一种新方法。由于np.nan在这里产生了很多问题。它工作得很好,一次又一次地感谢@COLDSPEED您为我节省了很多时间time@MartinHeusen别担心。我只是有点失望,pandas不支持子片间的str方法,或者这可能会加快很多。是的,我知道,应用功能总是会减慢速度,特别是在处理像我正在处理的问题这样的有1000万行的数据帧时。@cᴏʟᴅsᴘᴇᴇᴅ 添加一种新方法。由于np.nan在这里产生了很多问题。我可以将其视为一种很好的选择。我不能肯定它的速度。。。在这里看计时会很有趣。@cᴏʟᴅsᴘᴇᴇᴅ 添加时间~:-谢谢!我认为秒的速度慢是由于堆栈操作。但这是一个不错的选择,我认为这是一个不错的选择。我不能肯定它的速度。。。在这里看计时会很有趣。@cᴏʟᴅsᴘᴇᴇᴅ 添加时间~:-谢谢!我认为秒的速度慢是由于堆栈操作。但还是有一个好的。