【问题标题】:Concatenating multiple dataframe columns into a single array under a dataframe column将多个数据框列连接到数据框列下的单个数组中
【发布时间】:2019-10-15 14:29:25
【问题描述】:

我正在尝试将数据帧中的多列(都是数字)连接到数据帧单列下的数组中。需要注意的是,如果连接列具有 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]

因此,对于上述输出的任何解决方案都将不胜感激。

【问题讨论】:

    标签: python arrays pandas dataframe


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • df.iloc[:, 1:].apply(lambda x: x.dropna().tolist(), axis=1) ?
    • @Daniel - 感谢您提供的解决方案,这对我有用
    • @Datta 很高兴我能帮上忙。请考虑将此答案标记为已接受,因为它会向其他人表明您的问题已解决。
    猜你喜欢
    • 2017-01-10
    • 2020-09-13
    • 2021-12-21
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2016-02-03
    • 2021-06-10
    相关资源
    最近更新 更多