Python 3 /熊猫|在IF和ELIF语句中使用Function来填充列

问题描述 投票:0回答:2

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')

关于如何解决此错误的任何想法,以便可以实现此目标?是否有另一种方法可以达到相同的结果?

感谢您的帮助!

python pandas dataframe
2个回答
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))))

0
投票

使用熊猫的stack方法的解决方案:

stack
© www.soinside.com 2019 - 2024. All rights reserved.