合并panda数据帧列时出错



我正试图将同一数据帧中的三列合并为一列。

这里是我的数据帧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按照这里提出的解决方案,我使用了这个代码:

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

然而,通过这样做,只有来自列label_2的值在列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',)  

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

感谢

使用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]

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

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

感谢您的建议。

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

我解决了以下问题:

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)

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

最新更新