【问题标题】:Use one df column to filter another df, multiple filter使用一个df列过滤另一个df,多个过滤器
【发布时间】:2021-09-07 11:29:53
【问题描述】:

我想根据 df2 的 Version 列中的值过滤 df1,然后将 df1 中的 Cost Total 更改为 0。我想更改 df2 中那些版本的成本。
df1 为 [24867 行 x 63 列]
df2 是 [35 行 x 7 列]

我用于过滤和设置值的代码是:

        df1.loc[
            (df1['Group'] == "CBSS_cq_....JZJN") &
            (df1['Version – USE'] == df2['Version - USE']),
            df1['Cost Total']] = 0

代码将所有“组”的总成本分配为 0,它没有过滤我的第二个版本条件。给出错误:

raise ValueError("只能比较标签相同的系列对象")
ValueError:只能比较标签相同的系列对象

请注意,当我使用 .values 时:

    df1.loc[
            (df1['Group'] == "CBSS_.......KJZJN") &
            (df1['Version – USE'].values == df2['Version'].values),
            df1['Cost Total']] = 0  

给我以下错误:

block_values = np.empty(block_shape, dtype=dtype)
ValueError:数组太大; arr.size * arr.dtype.itemsize 大于最大可能大小。

**********以上以.isin *************排序

我的 df2 是 24 个 excel 文件的模板文件,每个文件有 3-4 张。我已经浏览了所有文件及其工作表。
索引模板文件被命名为-

AdDape CBS 索引模板 6.3.xlsx
AdDape 中年指数模板 5.3.xlsx

如下所示:

print("\nIndex Template Files\n")
os.chdir('path to my \IndexTemplatefiles')
FileList = glob.glob('*.xlsx')
print(FileList)

for fname in FileList:
    excel = pd.ExcelFile(fname)

sheets = pd.ExcelFile(fname).sheet_names  # list of sheets
print(fname)

for sheet in excel.sheet_names:

    df2 = pd.read_excel(excel, sheet_name=sheet)

    df3 = pd.read_excel(CostGroupFile, sheet_name='Sheet2')

    #merging df1 and df2
    df1 = pd.merge(df1, df2, left_on='Version', right_on='Version Market - USE', how='left')

    df1.loc[(
        (df1['Cost Group'] == "CBSS_ron_rt_na_disp_JZJN") &
        (df1['Version'].isin(df2['Version Market - USE'])),
        'Cost Total')] = (df1['Market Spend'] / df1['Sum of Impressions']) * df1['Impressions']

    #deleting extra columns
    df1 = df1.drop(columns=['..all columns that came after merging'])

    df1.to_excel(writer, index=False)
    writer.save()

此代码正在运行并更新成本总值,但您可以看到我手动输入的成本组,我希望它是动态的。

如果 excel 文件(索引模板文件)名称与 df3[filename] 相似,并且其工作表名称(即 df2 的 sheetname)与 df3[Sheetname] 相似,则使用相应的成本组并在过滤器部分中使用过滤 df1 并更新总成本。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您有数据示例吗?
    我不确定这是否是你想要的……虽然你可以试试这个

    df1.loc[df1['Version – USE'].isin(df2['Version - USE']), 'Cost Total'] = 0
    

    【讨论】:

    • 谢谢!这不会给我任何错误,但它只是在我的第一个条件下过滤,而不是第二个条件!
    • 你可以做df1.loc[(df1['Group'] == "CBSS_cq_....JZJN")) & (df1['Version – USE'].isin(df2['Version - USE'])), 'Cost Total'] = 0
    • 是的,现在可以了!谢谢!!现在我明白了为什么它不是最初的原因,因为我正在循环浏览 excel 文件的工作表。我给出的成本组仅与第一张表匹配,而不与其他表匹配,因此 df 没有保留更改。当我删除其他工作表并先阅读时,它就可以工作了。您能帮我动态读取成本组吗,我的 df3 中有成本组列?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2021-05-07
    • 2021-10-26
    • 2018-12-01
    • 2020-10-28
    • 1970-01-01
    • 2020-03-04
    相关资源
    最近更新 更多