数据类型检查、条件逻辑以及np.where、df.sort_values和cumsum的使用

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

这是一个关于使用 pandas 数据帧内的多个输入值计算 Flag 值 0 或 1 的问题。同时,如果任何输入值不是浮点值(或者为空,即 pandas 中的 NaN),则 Flag 将为空,即 ''

假设,cols_to_check表示用作输入的列的列表。

# Function to check if a value is a floating point number
def is_floating_point(aString):
    if (aString==aString): #this is to handle NaN values
        try:
            float(aString)
            return True
        except (ValueError, TypeError):
            return False
    else:
        return False

# Check if all input values in the specified columns are floating points
data['valid'] = data[cols_to_check].applymap(is_floating_point).all(axis=1)
    
# Calculate the flag value
    data['flag'] = np.where(data['valid'], data.sort_values(cols_to_check, ascending=[True, True, False, False, False,False]).groupby("emp_f8")["Rank"].cumsum(), '')
    # data['flag'] = data.sort_values(cols_to_check, ascending=[True, True, False, False, False,False]).groupby("emp_f8")["Rank"].cumsum()
    
# Ensure flag is 0 or 1 (unless input data quality issue then it'd be '')
data['flag'] = np.where(data['flag'].astype(str) == '1','1', np.where(data['flag'].astype(str) == '', '', '0'))

在上面的代码中,如果我不检查有效的输入数据集,我似乎会得到正确的标志值。如果我确实检查输入数据集的有效性(即所有输入值都是浮点值而不是 Null/空白/NaN),那么我将无法获得正确的标志值。

如果我包含 np.where(data['valid'],

的部分,为什么它不能正常工作

在我看来,数据类型检查和 np.where 语句导致了意外的行为。我得到的标志值为 1,而对于给定的输入数据集,我应该得到的标志值为 0 和 1。

python pandas numpy types
1个回答
0
投票

这可能是因为

sort_values
中的
np.where
。先尝试排序。

data = data.sort_values(cols_to_check, ascending=[True, True, False, False, False,False])

data['valid'] = data[cols_to_check].applymap(is_floating_point).all(axis=1)
    
data['flag'] = np.where(data['valid'], data.groupby("emp_f8", sort=False)["Rank"].cumsum(), '')

data['flag'] = np.where(data['flag'].astype(str) == '1','1', np.where(data['flag'].astype(str) == '', '', '0'))
© www.soinside.com 2019 - 2024. All rights reserved.