如何将多个dataframe列组合成一个给定的列,每个列都有nan值

2024-09-19 23:40:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为“main_df”的数据帧,它包含3列X、Y、Z

X        Y       Z
NaN      NaN     ZVal1
NaN      NaN     ZVal2
XVal1    NaN     NaN
NaN      YVal1   NaN

每一列都包含特定类型(X、Y、Z)的数据,因此,如果某一行的X列中有数据,则Y/Z列中不会有数据,因为它不是X类型

如果您将所有3列组合在一起,它们会整齐地“相互滑动”,您将得到所有向下的值

如何将这3列合并到第4列中,以便忽略NaN值,而只获取该行3列中存在的任何单个值

预期产出:

X        Y       Z           XYZ
NaN      NaN     ZVal1       ZVal1
NaN      NaN     ZVal2       ZVal2
XVal1    NaN     NaN         XVal1    
NaN      YVal1   NaN         YVal1   

数据帧代码:

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(columns=['X', 'Y', 'Z'], data=[[np.NaN, np.NaN, 'ZVal1'], [np.NaN, np.NaN, 'ZVal2'], ['XVal1', np.NaN, np.NaN], [np.NaN,'YVal1' ,np.NaN]])

现在,我正试图按照以下思路做一些事情:

df['XYZ'] = df['X'].astype(str) + df['Y'].astype(str) + df['Z'].astype(str) but that combines the NaN values into one long string


Tags: 数据import类型dfasnpnanpd
2条回答

stack一起:

df["XYZ"] = df.stack().values

得到

>>> df

       X      Y      Z    XYZ
0    NaN    NaN  ZVal1  ZVal1
1    NaN    NaN  ZVal2  ZVal2
2  XVal1    NaN    NaN  XVal1
3    NaN  YVal1    NaN  YVal1

因为您保证每行只有1个非NaN,并且默认情况下stack会删除NaN


使用花式索引的另一种方法:

df["XYZ"] = df.to_numpy()[np.arange(len(df)),
                          df.columns.get_indexer(df.notna().idxmax(axis=1))]

对于每一行,它查看非NaN值的索引并选择它

尝试:

df["XYZ"] = df.apply(lambda x: x[x.notna()][0], axis=1)
print(df)

印刷品:

       X      Y      Z    XYZ
0    NaN    NaN  ZVal1  ZVal1
1    NaN    NaN  ZVal2  ZVal2
2  XVal1    NaN    NaN  XVal1
3    NaN  YVal1    NaN  YVal1

或:

df["XYZ"] = df.bfill(axis=1)["X"]
print(df)

相关问题 更多 >