我正在尝试将特定列的值与列之一进行比较,并根据它们的比较索引将结果存储到新列中,例如:如果值相差超过10%,则为低,否则为OK。
df["Index"] = ""
def function(df):
for i in range(1, len(df.columns)-2):
if((df.columns.values[1]) == (df.columns.values[i+1])):
if((df.iloc[:,1]) < (0.9 * df.iloc[:,i+1])):
df["Index"] = "Low"
else:
df["Index"] = "OK"
function(df)
什么是
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
对此?如果有人也可以建议使用相同代码结构降低时间复杂度的方法,那就太好了。
答案 0 :(得分:1)
是否要针对年龄之后的任何列检查年龄?如果其中之一减少了90%,则结果为“确定”?我不确定您需要的逻辑是吗?
df = pd.DataFrame({'char':['A', 'B', 'C', 'D'],'Age':[20, 21, 19, 18],'Age1':[29, 27, 25, 26],'Age2':[60, 48, 55, 62], 'Age3':[60, 48, 55, 62],'Age4':[60, 48, 55, 62],'Age5':[18, 19, 17, 12]})
df["Index"] = ""
def function(df):
for i in range(1, len(df.columns)-2):
df['Index'] = np.where(df.iloc[:, 1] < 0.9 * df.iloc[:, i + 1], 'Low', 'Ok')
function(df)
输出:
char Age Age1 Age2 Age3 Age4 Age5 Index
0 A 20 29 60 60 60 18 Ok
1 B 21 27 48 48 48 19 Ok
2 C 19 25 55 55 55 17 Ok
3 D 18 26 62 62 62 12 Ok
如果我将Age
值之一更改为1,以使Age[i+1]
列大于90%,则结果为
char Age Age1 Age2 Age3 Age4 Age5 Index
0 A 1 29 60 60 60 18 Low
1 B 21 27 48 48 48 19 Ok
2 C 19 25 55 55 55 17 Ok
3 D 18 26 62 62 62 12 Ok
答案 1 :(得分:0)
我不太确定问题背后的逻辑,但是如果有很多列,您可以考虑使用类似的
import pandas as pd
df = pd.DataFrame({'char':['A', 'B', 'C', 'D'],
'Age':[20, 21, 19, 18],
'Age1':[29, 27, 25, 26],
'Age2':[60, 48, 55, 62],
'Age3':[60, 48, 55, 62],
'Age4':[60, 48, 55, 62],
'Age5':[18, 19, 17, 12]})
cols2compare = df.columns[df.columns.str.startswith("Age")]
diz = {True:"Ok", False:"Low"}
df["Index"] = df[cols2compare].apply(lambda x: x["Age"] < x.max()*.9,
axis=1).map(diz)