Pandas Dataframe Python:代码错误修复和简化-如果位置=';Y';

Pandas Dataframe Python:代码错误修复和简化-如果位置=';Y';,python,pandas,numpy,dataframe,debugging,Python,Pandas,Numpy,Dataframe,Debugging,输入说明:具有数据帧df,列如下所述: Store Category Space Location 11 AA 2.0 Y 11 BB 1.5 Y 11 CC 3.0 N 12 AA 4.2 Y 得到了一个变量“位置百分比=0.5”(50%) 场景:对于每个门店,位置值为“Y”的每个类别的空格列值必须除以给定的“位置百分比”。如果特定门店

输入说明:具有数据帧
df
,列如下所述:

Store   Category    Space   Location
11      AA          2.0     Y
11      BB          1.5     Y
11      CC          3.0     N
12      AA          4.2     Y
得到了一个变量“位置百分比=0.5”(50%)

场景:对于每个门店,位置值为“Y”的每个类别的空格列值必须除以给定的“位置百分比”。如果特定门店类别的空间值减少,则添加一列“减少”

预期输出:

Store   Category    Space   Location    Reduced
11      AA          1.0     Y           Y
11      BB          0.75    Y           Y
11      CC          3.0     N           N
12      AA          2.1     Y           Y
已尝试代码:这无法按预期工作。此外,需要简化场景的方法,而不需要太多for/if循环

loc_perc = 0.5
Store = 'Store'
Category = 'Category'
Location = 'Location'
Space = 'Space'

for i in dfOutput[Store].unique().tolist():

    dfNew = dfOutput[dfOutput[Store] == i].copy()
    dual_flows = dfNew[Category][dfNew[Location] == 'Y'].unique()
    
    for flow in dual_flows.tolist():
        
        if flow in dfNew[Category].values:
        
            original_space = dfNew[Space][dfNew[Category] == flow]
            reduced_space = original_space * loc_perc
            dfNew[Space] = reduced_space
            

您可以创建一个临时列来保存空间的当前值,根据
位置
空间
计算新值,最后创建一个新列
减少
,如果
空间
中的值确实减少了

您可以将
numpywhere
视为if-else语句

loc_perc = 0.5

df.assign(
    temp=lambda x: x.Space,
    Space=lambda x: np.where(x.Location == "Y", x.Space * loc_perc, x.Space),
    Reduced=lambda x: np.where(x.Space < x.temp, "Y", "N"),
).drop("temp", 1)



  Store Category    Space   Location    Reduced
0   11      AA      1.00        Y       Y
1   11      BB      0.75        Y       Y
2   11      CC      3.00        N       N
3   12      AA      2.10        Y       Y
loc_perc=0.5
分配(
温度=λx:x.空间,
空间=λx:np.式中(x.Location==“Y”,x.Space*loc_perc,x.Space),
约化=λx:np.式中(x.空间
您可以创建一个临时列来保存空间的当前值,根据
位置
空间
计算新值,最后创建一个新列
减少
,如果
空间
中的值确实减少了

您可以将
numpywhere
视为if-else语句

loc_perc = 0.5

df.assign(
    temp=lambda x: x.Space,
    Space=lambda x: np.where(x.Location == "Y", x.Space * loc_perc, x.Space),
    Reduced=lambda x: np.where(x.Space < x.temp, "Y", "N"),
).drop("temp", 1)



  Store Category    Space   Location    Reduced
0   11      AA      1.00        Y       Y
1   11      BB      0.75        Y       Y
2   11      CC      3.00        N       N
3   12      AA      2.10        Y       Y
loc_perc=0.5
分配(
温度=λx:x.空间,
空间=λx:np.式中(x.Location==“Y”,x.Space*loc_perc,x.Space),
约化=λx:np.式中(x.空间
酷!这工作完美而简单。感谢您的时间和帮助@sammywemmyCool!这工作完美而简单。谢谢你的时间和帮助@sammywemmy