我试图将一个数据帧中的多个列(都为数字)串联到一个数据帧的单个列下的数组中。需要注意的是,如果串联的列具有NAN,则不应串联。
输入数据框:
userid | p1 | p2 |p3 | p4 | p5
1 | NAN| NAN| 20| 30 | 40
1 | NAN| 30 | 60| 80 | 100
2 | NAN| NAN|NAN| NAN| 45
我已经尝试过此解决方案,但它不会删除nan:
df['combined'] = df[['p5','p4','p3','p2','p1']].apply(tuple,axis=1).apply(np.array)
最终输出数据帧必须看起来像这样(串联的顺序为p5,p4,p3,p2,p1),同时在串联时还要排除nan:
userid | p1 | p2 |p3 | p4 | p5 | combined
1 | NAN| NAN| 20| 30 | 40 | [40,30,20]
1 | NAN| 30 | 60| 80 | 100| [100,80,60,30]
2 | NAN| NAN|NAN| NAN| 45 | [45]
因此,对于上述输出的任何解决方案将不胜感激。
最佳答案
您可以使用pd.isna使用布尔掩码过滤掉NaN
值:
df['combined'] = df[['p5', 'p4', 'p3', 'p2', 'p1']].apply(lambda x: x[~pd.isna(x)].values, axis=1)
print(df)
输出量
userid p1 p2 p3 p4 p5 combined
0 1 NaN NaN 20.0 30.0 40 [40.0, 30.0, 20.0]
1 1 NaN 30.0 60.0 80.0 100 [100.0, 80.0, 60.0, 30.0]
2 2 NaN NaN NaN NaN 45 [45.0]
如@jpp所述,您也可以使用dropna删除它们:
lambda x: x.dropna().values
关于python - 将多个数据框列连接到一个数据框列下的单个数组中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58397005/