Python 如何在给定可变条件数的情况下设置数据帧上的值?

Python 如何在给定可变条件数的情况下设置数据帧上的值?,python,pandas,iterable-unpacking,Python,Pandas,Iterable Unpacking,输出: 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", "he

输出:

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
问题: 在给定一个或多个条件的情况下,如何创建单个函数,使一行或多行中的“值”为零

示例:

   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
我迄今为止的努力: 我尝试用*解包来实现这一点,但没有成功,因为我不知道如何使用解包变量设置多个条件。它很容易设置多个条件,如果我硬编码的条件数量虽然。。。
df[(条件1)和(条件2)和(条件3)]=0

此外,这可能超出了问题的范围,如何使用*unpacking(或不硬编码if语句中的条件数)为常规if语句设置可变数量的条件

例如

如果a>0而b>4
#或者。。。
如果a>0,b>4,c<2

非常感谢您的帮助。

如果我理解正确,您正在寻找方法:

印刷品:

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)

zero_out(df,[(“动物”、“狗”),(“眼睛”、“蓝色”)))


如果我理解正确,您正在寻找方法:

印刷品:

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)

zero_out(df,[(“动物”、“狗”),(“眼睛”、“蓝色”)))

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

您也可以使用它。它比Andrej的方法更通用,因为它不假设筛选值是字符串。

您可以尝试:

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
结果:

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"))
您可以尝试:

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
结果:

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"))
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"))
   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