Python3/Pandas |将函数与IF&;用于填充列的ELIF语句
Python 3/Pandas 我试图使用一个函数来检查数据帧中各个列的值,并仅从而不是NaN的列中选择值 数据是结构化的,因此有一个主列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值,只有一列有文本值。这适用于数据帧中的所有行。我正在尝试编写一个函数,该函数将应用于数据帧,以查找具有文本值的列,并
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