Python 3 /熊猫
我正在尝试使用一个函数来检查数据帧中各个列的值,并仅从not NaN列中选择值。
数据是结构化的,因此我要根据接下来的四列df['C1']
和df['C2'], df['C3'], df['C4']
之一中的值填充一个主列df['C5']
。当我观察数据时,我看到在df['C2'], df['C3'], df['C4']
和df['C5']
行中,每一列的值都是NaN,只有一列具有文本值。对于数据框中的所有行都是如此。我正在尝试编写一个将应用于数据框的函数,以查找具有文本值的列,并将该值从该列复制到df['C1']
。
这是我写的函数:
def get_component(df):
if ~df['C2'].isna():
return df['C2']
elif ~df['C3'].isna():
return df['C3']
elif ~df['C4'].isna():
return df['C4']
elif ~df['C5'].isna():
return df['C5']
df['C1'] = df.apply(get_component, axis=1)
但出现以下错误:
AttributeError: ("'float' object has no attribute 'isna'", 'occurred at index 0')
关于如何解决此错误的任何想法,以便可以实现此目标?是否有另一种方法可以达到相同的结果?
感谢您的帮助!
没关系,我认为它只是偶然发现了np.where,并使用以下代码解决了问题:
df['C1'] = np.where(~df['C2'].isna(),df['C2'],
np.where(~df['C3'].isna(),df['C3'],
np.where(~df['C4'].isna(),df['C4'],
np.where(~df['C5'].isna(),df['C5'],None))))
使用熊猫的stack
方法的解决方案:
stack