Python3/Pandas |将函数与IF&;用于填充列的ELIF语句

Python3/Pandas |将函数与IF&;用于填充列的ELIF语句,python,pandas,dataframe,Python,Pandas,Dataframe,Python 3/Pandas 我试图使用一个函数来检查数据帧中各个列的值,并仅从而不是NaN的列中选择值 数据是结构化的,因此有一个主列df['C1'],我想根据以下四列之一的值填充该列,df['C2']、df['C3']、df['C4']和df['C5']。当我观察数据时,我看到在df['C2']、df['C3']、df['C4']和df['C5']行中,每一列都有一个NaN值,只有一列有文本值。这适用于数据帧中的所有行。我正在尝试编写一个函数,该函数将应用于数据帧,以查找具有文本值的列,并

Python 3/Pandas

我试图使用一个函数来检查数据帧中各个列的值,并仅从而不是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))))

利用熊猫方法的解决方案:


欢迎来到堆栈溢出!请提供您的输入数据和所需输出的样本,以便我们更好地了解您的问题。请参阅以获取更多帮助这是否回答了您的问题?
import pandas as pd
import numpy as np

# Initialize example dataframe
df = pd.DataFrame({
    "C2": [np.nan, 3, np.nan, np.nan, np.nan],
    "C3": [5, np.nan, np.nan, np.nan, np.nan],
    "C4": [np.nan, np.nan, np.nan, 7, 3],
    "C5": [np.nan, np.nan, 2, np.nan, np.nan],
})

df["C1"] = df.stack().to_numpy()
print(df)
# Output:
#     C2   C3   C4   C5   C1
# 0  NaN  5.0  NaN  NaN  5.0
# 1  3.0  NaN  NaN  NaN  3.0
# 2  NaN  NaN  NaN  2.0  2.0
# 3  NaN  NaN  7.0  NaN  7.0
# 4  NaN  NaN  3.0  NaN  3.0