pandas 将筛选行中的值更改为另一行的筛选值

kwvwclae  于 2023-08-01  发布在  其他
关注(0)|答案(1)|浏览(144)

我正在自动化一个大型Excel过程,我不知道如何在过滤了两行时根据另一行更改行的值。我创建了一个示例数据框架来演示这个问题。

data = {'Category': ['WC', 'WC', 'GL', 'WC', 'WC', 'WC', 'WC'],
        'Year': [2024, 2023, 2022, 2023, 2024, 2021, 2022],
        'Type': ['Direct', 'QS', 'Direct', 'Direct', 'QS', 'Direct', 'Direct'],
        'Code': [1450, 1450, 2000, 1450, 1450, 1500, 1450],
        'Total': [9, 3, 5, 7, 2, 4, 6]}

df = pd.DataFrame(data)

字符串
创建如下所示的数据框:

Category  Year    Type  Code  Total
0       WC  2024  Direct  1450      9
1       WC  2023      QS  1450      3
2       GL  2022  Direct  2000      5
3       WC  2023  Direct  1450      7
4       WC  2024      QS  1450      2
5       WC  2021  Direct  1500      4
6       WC  2022  Direct  1450      6


我想要改变的是,我希望直接行中的总值是相应年份QS中总列值的两倍,同时在下面代码中的过滤器上过滤。所以,新的数据框看起来像这样:

Category  Year    Type  Code  Total
0       WC  2024  Direct  1450      4
1       WC  2023      QS  1450      3
2       GL  2022  Direct  2000      5
3       WC  2023  Direct  1450      6
4       WC  2024      QS  1450      2
5       WC  2023  Direct  1500      4
6       WC  2022  Direct  1450      6


为了实现这个结果,我尝试使用以下代码:

WCdf = df[(df.Category == 'WC') & (df.Year > 2022) & (df.Code == 1450) & (df.Type == 'QS')]
df.loc[(df['Code'] == 1450) & (df['Category'] == 'WC') & (df['Year'] > 2022) & (df['Type'] == 'Direct'), 'Total'] = 2 * WCdf.Total


WCdf中确实有正确的行,但是当我使用这段代码时,它只是将我想要更改的值转换为NaN。鉴于种种限制,我不太确定如何达到我所期待的结果。我想在这种情况下我可能不能使用.loc函数,但我不确定我会使用什么来代替。

toiithl6

toiithl61#

您可以尝试:

# create a dictionary with new Total values
m = {row["Year"]: row["Total"] * 2 for _, row in df[df["Type"].eq("QS")].iterrows()}

# apply the new Total values in rows with Type == "Direct"
mask = df["Type"].eq("Direct")
df.loc[mask, "Total"] = df[mask].apply(lambda x: m.get(x["Year"], x["Total"]), axis=1)
print(df)

字符串
图纸:

Category  Year    Type  Code  Total
0       WC  2024  Direct  1450      4
1       WC  2023      QS  1450      3
2       GL  2022  Direct  2000      5
3       WC  2023  Direct  1450      6
4       WC  2024      QS  1450      2


编辑:附加条件:

m = {row["Year"]: row["Total"] * 2 for _, row in df[df["Type"].eq("QS")].iterrows()}

mask = df["Type"].eq("Direct") & (df["Year"] > 2022) & (df["Code"] == 1450)
df.loc[mask, "Total"] = df[mask].apply(lambda x: m.get(x["Year"], x["Total"]), axis=1)

相关问题