基本上,我有这样的数据帧:
c1 c2
0 a x
1 b NaN
我想要这样的列c
:
c1 c2 c
0 a x [a, x]
1 b NaN [b]
这是我的解决方案:
import pandas as pd
import numpy as np
df = pd.DataFrame({'c1': ['a', 'b'], 'c2': ['x', np.nan]})
df['c'] = df[['c1', 'c2']].values.tolist()
df['c'] = df['c'].apply(lambda x: [i for i in x if i is not np.nan])
但我认为存在一些更短、更简单、更具讽刺意味的东西。你能帮我拿一条吗?
让我们试用stack
和groupby
df['c'] = df.stack().groupby(level=0).agg(list)
list
理解的替代方法
df['c'] = [v[pd.notna(v)] for v in df.values]
c1 c2 c
0 a x [a, x]
1 b NaN [b]
df["c"] = df.apply(lambda x: x[x.notna()].tolist(), axis=1)
print(df)
打印:
c1 c2 c
0 a x [a, x]
1 b NaN [b]