这是一个关于使用 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。
这可能是因为
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'))