在 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
假设我们必须遵循 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