如果在熊猫数据框中其他功能[重复]

Posted

技术标签:

【中文标题】如果在熊猫数据框中其他功能[重复]【英文标题】:if else function in pandas dataframe [duplicate] 【发布时间】:2017-09-09 12:52:02 【问题描述】:

我正在尝试在数据帧上应用 if 条件,但我遗漏了一些东西(错误:系列的真值不明确。使用 a.empty、a.bool()、a.item() , a.any() 或 a.all()。)

raw_data = 'age1': [23,45,21],'age2': [10,20,50]
df = pd.DataFrame(raw_data, columns = ['age1','age2'])

def my_fun (var1,var2,var3):
if (df[var1]-df[var2])>0 :
    df[var3]=df[var1]-df[var2]
else:
    df[var3]=0
print(df[var3])

my_fun('age1','age2','diff')

【问题讨论】:

错误意味着,在您选择的列中有一些值,它们被评估为 True,还有一些值被评估为 False。您可能需要每行运行 my_fun。 我不知道每行的这种方法,你能给我任何提示吗? 查看@jezrael 的答案,这是更好的解决方案 【参考方案1】:

你可以使用numpy.where:

def my_fun (var1,var2,var3):
    df[var3]= np.where((df[var1]-df[var2])>0, df[var1]-df[var2], 0)
    return df

df1 = my_fun('age1','age2','diff')
print (df1)
   age1  age2  diff
0    23    10    13
1    45    20    25
2    21    50     0

错误最好解释here。

使用apply 的较慢解决方案,其中需要axis=1 用于按行处理数据:

def my_fun(x, var1, var2, var3):
    print (x)
    if (x[var1]-x[var2])>0 :
        x[var3]=x[var1]-x[var2]
    else:
        x[var3]=0
    return x    

print (df.apply(lambda x: my_fun(x, 'age1', 'age2','diff'), axis=1))
   age1  age2  diff
0    23    10    13
1    45    20    25
2    21    50     0

也可以使用loc,但有时数据会被覆盖:

def my_fun(x, var1, var2, var3):
    print (x)
    mask = (x[var1]-x[var2])>0
    x.loc[mask, var3] = x[var1]-x[var2]
    x.loc[~mask, var3] = 0

    return x    

print (my_fun(df, 'age1', 'age2','diff'))
   age1  age2  diff
0    23    10  13.0
1    45    20  25.0
2    21    50   0.0

【讨论】:

关键是,在现实生活中,条件更加棘手,似乎与 np.where 嵌套可能有点难以阅读。使用更传统的 if-elif-else 语句是否有任何改变? 我使用apply 添加解决方案。你是对的,如果意味着有许多 elif 的复杂条件,apply 会更好。 谢谢,既然你问了更多细节,我打开了另一个话题,只是为了避免在这个 3d 中混淆。 ***.com/questions/43393672/… @progster 也可以随意投票给这个答案。以及您认为有用的任何其他答案。【参考方案2】:

您可以使用pandas.Series.where

df.assign(age3=(df.age1 - df.age2).where(df.age1 > df.age2, 0))

   age1  age2  age3
0    23    10    13
1    45    20    25
2    21    50     0

你可以把它包装在一个函数中

def my_fun(v1, v2):
    return v1.sub(v2).where(v1 > v2, 0)

df.assign(age3=my_fun(df.age1, df.age2))

   age1  age2  age3
0    23    10    13
1    45    20    25
2    21    50     0

【讨论】:

【参考方案3】:

没有np.wherepd.Series.where 还有另一种方法。我并不是说它更好,但是在尝试使这个解决方案适应今天一个具有挑战性的问题之后,发现where 的语法并不那么直观。最后,不确定在哪里是否有可能,但发现以下方法可以让您在修改子集之前查看它,并且它对我来说更快地导致了解决方案。当然也适用于这里的 OP。

您故意在数据帧的切片上设置值,因为 Pandas 经常警告您不要这样做。

This 答案向您展示了正确的方法。

下面给你一个片段:

df.loc[df['age1'] - df['age2'] > 0]

..看起来像:

   age1  age2
0    23    10
1    45    20

在原始数据框中为修改切片后要保留的值添加额外的列:

df['diff'] = 0

现在修改切片:

df.loc[df['age1'] - df['age2'] > 0, 'diff'] = df['age1'] - df['age2']

..结果:

   age1  age2  diff
0    23    10    13
1    45    20    25
2    21    50     0

【讨论】:

以上是关于如果在熊猫数据框中其他功能[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何通过使用数据框中的其他列来聚合熊猫数据框中的列

如何根据在熊猫数据框中的其他列上应用条件来提取列值

如何在熊猫数据框中找到重复项? [复制]

应用一个函数来翻译熊猫数据框中的一列,条件是其他列

Groupby 并根据熊猫数据框中的其他列比较/过滤特定组

遍历熊猫数据框中的列