【问题标题】:Error in merging pandas data frame columns合并熊猫数据框列时出错
【发布时间】:2021-03-17 00:07:32
【问题描述】:

我正在尝试将同一数据框中的三列合并为一列。

这是我的数据框selected_vals

   label_1                         label_2                   label_3   
0  NaN                              NaN                      NaN
1  ('__label__Religione_e_Magia',)  NaN                      NaN
2  NaN                            ('__label__Storia',)       NaN
3  NaN                            ('__label__Storia',)       NaN
4 ('__label__Religione_e_Magia',)  NaN                       NaN

数据框每行只有一个值,因此在未指定值的列中,我有NaN 按照here提出的解决方案,我使用了这段代码:

selected_vals['selected_vals'] =  selected_vals.loc[:,selected_vals.columns.tolist()[1:]].apply(lambda x: x.dropna().tolist(), 1)

但是,通过这样做,只有来自 col label_2 的值在 col selected_vals 中

这里是输出

 label_1                         label_2                   label_3  selected_vals   
0  NaN                              NaN                      NaN      []
1  ('__label__Religione_e_Magia',)  NaN                      NaN      []
2  NaN                            ('__label__Storia',)       NaN      ('__label__Storia',)
3  NaN                            ('__label__Storia',)       NaN      ('__label__Storia',)
4 ('__label__Religione_e_Magia',)  NaN

作为所需的输出,我希望将所有值存储在同一列中,即

   selected_vals                              
0  NaN                              
1  ('__label__Religione_e_Magia',)  
2  ('__label__Storia',)                                   
3  ('__label__Storia',)                            
4 ('__label__Religione_e_Magia',)  

关于如何处理这个问题的建议?

谢谢

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用DataFrame.iloc 选择所有没有第一列的列,然后转发缺失值并最后选择最后一列:

    #replace NaN strings to np.nan if necessary
    selected_vals = selected_vals.replace('NaN', np.nan)
    
    selected_vals['selected_vals'] =  selected_vals.iloc[:,1:].ffill(axis=1).iloc[:, -1]
    

    【讨论】:

    • 感谢您的建议。不幸的是,我仍然有相同的输出
    • @Pelide - 如果测试print (selected_vals.iloc[:,1:],isna()) 得到Trues 以​​获得NaNs?
    • @Pelide - 如果没有,请尝试selected_vals = selected_vals.replace('NaN', np.nan)
    【解决方案2】:

    您可以将函数应用于每一行并只保留所需的值(其中列不是 NaN)

    selected_vals['selected_vals'] = selected_vals.apply(lambda row: row[row[pd.notnull(row)].index.item()], axis=1)
    

    【讨论】:

      【解决方案3】:

      感谢您的建议。

      我认为问题与数据框的类型有关。

      我解决了如下问题:

      selected_vals = selected_vals.replace(np.nan, '', regex=True)
      selected_vals = selected_vals.applymap(str)
      df['suggested_label'] = selected_vals["label_1"].astype(str) + selected_vals["label_2"]+ selected_vals["label_3"]
      
      print(df)
      
      

      不知道它是否正确,但至少它对我有用。

      【讨论】:

        猜你喜欢
        • 2018-02-16
        • 1970-01-01
        • 2016-10-31
        • 2021-06-17
        • 1970-01-01
        • 2013-09-26
        • 1970-01-01
        • 2019-06-29
        • 1970-01-01
        相关资源
        最近更新 更多