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