首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在dataframe上设置一个可变数目的条件?

如何在dataframe上设置一个可变数目的条件?
EN

Stack Overflow用户
提问于 2019-12-26 18:00:13
回答 3查看 157关注 0票数 1
代码语言:javascript
代码运行次数:0
运行
复制
from itertools import product
import pandas as pd

animals = ["dogs", "cats"]
eyes = ['brown', 'blue', 'green']
height = ['short', 'average', 'tall']
a = [animals, eyes, height]
df = pd.DataFrame(list(product(*a)), columns=["animals", "eyes", "height"])
df['value'] = 1

输出:

代码语言:javascript
代码运行次数:0
运行
复制
   animals   eyes   height  value
0     dogs  brown    short      1
1     dogs  brown  average      1
2     dogs  brown     tall      1
3     dogs   blue    short      1
4     dogs   blue  average      1
5     dogs   blue     tall      1
6     dogs  green    short      1

问题:如何创建一个函数,使一个或多个行中的零“值”给定一个或多个条件?

示例:

代码语言:javascript
代码运行次数:0
运行
复制
# This would change all the 1s into 0s for all dogs with blue eyes.
zero_out(df, [("animals", "dogs"), ("eyes", "blue")])

# This would change all the 1s into 0s for all tall animals.
zero_out(df, [("height", "tall")])

到目前为止,我的尝试是:我尝试用*解包来完成这个任务,但是没有成功,因为我不知道如何使用未打包的变量设置多个条件。如果我硬编码条件的数量,很容易设置多个条件.df[(condition1) & (condition2) & (condition3)] = 0

此外,也许这超出了问题的范围,我如何使用*解包装(或者不对if语句中的条件数进行硬编码)来设置给定常规if语句的可变条件数?

例如。

代码语言:javascript
代码运行次数:0
运行
复制
if a > 0 and b > 4
#Or...
if a > 0 and b > 4 and c < 2

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-26 18:24:51

如果我正确地理解了您,您正在寻找.query()方法:

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd
from itertools import product

animals = ["dogs", "cats"]
eyes = ['brown', 'blue', 'green']
height = ['short', 'average', 'tall']
a = [animals, eyes, height]
df = pd.DataFrame(list(product(*a)), columns=["animals", "eyes", "height"])
df['value'] = 1


def zero_out(df, lst):
    q = ' & '.join( '{} == "{}"'.format(col, val) for col, val in lst )
    df.loc[df.query(q).index, 'value'] = 0

zero_out(df, [("height", "tall")])
print(df)

指纹:

代码语言:javascript
代码运行次数:0
运行
复制
   animals   eyes   height  value
0     dogs  brown    short      1
1     dogs  brown  average      1
2     dogs  brown     tall      0
3     dogs   blue    short      1
4     dogs   blue  average      1
5     dogs   blue     tall      0
6     dogs  green    short      1
7     dogs  green  average      1
8     dogs  green     tall      0
9     cats  brown    short      1
10    cats  brown  average      1
11    cats  brown     tall      0
12    cats   blue    short      1
13    cats   blue  average      1
14    cats   blue     tall      0
15    cats  green    short      1
16    cats  green  average      1
17    cats  green     tall      0

zero_out(df, [("animals", "dogs"), ("eyes", "blue")])

代码语言:javascript
代码运行次数:0
运行
复制
   animals   eyes   height  value
0     dogs  brown    short      1
1     dogs  brown  average      1
2     dogs  brown     tall      1
3     dogs   blue    short      0
4     dogs   blue  average      0
5     dogs   blue     tall      0
6     dogs  green    short      1
7     dogs  green  average      1
8     dogs  green     tall      1
9     cats  brown    short      1
10    cats  brown  average      1
11    cats  brown     tall      1
12    cats   blue    short      1
13    cats   blue  average      1
14    cats   blue     tall      1
15    cats  green    short      1
16    cats  green  average      1
17    cats  green     tall      1
票数 3
EN

Stack Overflow用户

发布于 2019-12-26 18:36:25

代码语言:javascript
代码运行次数:0
运行
复制
def zero_out(df, list_of_filters, out_column='value'):
    conds = np.ones(df.shape[0], dtype=bool)
    for col_name, val in list_of_filters:
        cond = df[col_name].eq(val)
        conds &= cond
    df.loc[conds, out_column] = 0
    return df

你也可以用这个。它比Andrej的方法更通用,因为它不假定过滤器值是字符串。

票数 2
EN

Stack Overflow用户

发布于 2019-12-26 18:37:22

你可以试试:

代码语言:javascript
代码运行次数:0
运行
复制
def zero_out(df, *args):
    df_temp = df.copy()
    for arg in args:
        df_temp = df_temp[df_temp[arg[0]] == arg[1]].copy()
    df.iloc[df_temp.index, -1] = 0
    return df

zero_out(df, ("animals", "dogs"), ("eyes", "blue"))

结果:

代码语言:javascript
代码运行次数:0
运行
复制
   animals   eyes   height  value
0     dogs  brown    short      0
1     dogs  brown  average      0
2     dogs  brown     tall      0
3     dogs   blue    short      0
4     dogs   blue  average      0
5     dogs   blue     tall      0
6     dogs  green    short      0
7     dogs  green  average      0
8     dogs  green     tall      0
9     cats  brown    short      1
10    cats  brown  average      1
11    cats  brown     tall      1
12    cats   blue    short      0
13    cats   blue  average      0
14    cats   blue     tall      0
15    cats  green    short      1
16    cats  green  average      1
17    cats  green     tall      1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59491847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档