我有一个名为“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) 但将 NaN 值合并为一个长字符串
与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 值的索引并选择它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句