假设我们必须关注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')
非常感谢任何帮助
答案 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