我试图将一个数据帧中的多个列(都为数字)串联到一个数据帧的单个列下的数组中。需要注意的是,如果串联的列具有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/

10-12 18:31
查看更多