我正在尝试将同一数据框中的三列合并为一列。
这里是我的数据框 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',)
关于如何处理这个问题的建议?
谢谢
答案 0 :(得分:0)
使用 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]
答案 1 :(得分:0)
您可以将函数应用于每一行并只保留所需的值(其中列不是 NaN)
selected_vals['selected_vals'] = selected_vals.apply(lambda row: row[row[pd.notnull(row)].index.item()], axis=1)
答案 2 :(得分:0)
感谢您的建议。
我认为问题与数据帧的类型有关。
我解决了以下问题:
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)
不知道它是否正确,但至少对我有用。