通过数据框进行条件循环

Posted

技术标签:

【中文标题】通过数据框进行条件循环【英文标题】:Conditional Looping through Dataframe 【发布时间】:2021-05-08 04:06:39 【问题描述】:

我在尝试循环数据帧时遇到了问题。我想要做的是,根据特定列中的字符串,给新列一个特定的值,然后重复行 x 次。否则,给该新列另一个值并重复 y 次。但是,当我尝试我的代码时,我收到以下问题:

ValueError:“数组长度 1 与索引长度 5 不匹配”。

我不确定我的逻辑有什么问题,并且想知道是否有人可以告诉我如何解决这个障碍。非常感谢您的帮助!

请在下面找到我的代码:

for x in df['GP Line Item Code:']:
    if x == "PS-AFS":
        lens = 1
        clientDetails = pd.DataFrame('Billing Date': np.repeat(df['Billed Date'], lens),
                    'Invoice #': np.repeat(df['GREAT PLAINS INV #'], lens),
                    'Customer #': np.repeat(df['GP Code'], lens),
                    'Customer Name': np.repeat(df['Client'], lens),
                    'Transaction ID': np.repeat(df['Quote ID'], lens),
                    'Description': np.repeat(df['Task'], lens),
                    'Department Group': np.repeat(df['Dept'], lens),
                    'Product Family': np.repeat(df['GP Line Item Code:'], lens),
                    'Revenue Type': np.repeat("Service", lens),
                    'Rev Rec Year': np.repeat(df['Billed Date'].dt.year, lens)
                   
                  )
    else:
        lens = 12
        clientDetails = pd.DataFrame('Billing Date': np.repeat(df['Billed Date'], lens),
                    'Invoice #': np.repeat(df['GREAT PLAINS INV #'], lens),
                    'Customer #': np.repeat(df['GP Code'], lens),
                    'Customer Name': np.repeat(df['Client'], lens),
                    'Transaction ID': np.repeat(df['Quote ID'], lens),
                    'Description': np.repeat(df['Task'], lens),
                    'Department Group': np.repeat(df['Dept'], lens),
                    'Product Family': np.repeat(df['GP Line Item Code:'], lens),
                    'Revenue Type': np.repeat("Maintenance", lens),
                    'Rev Rec Year': np.repeat(df['Billed Date'].dt.year, lens)
                   
                  )

我的逻辑是,对于数据框中的记录,请查看 GP 行项目代码。如果 GP 行项目代码为 PS-AFS,则将每条记录重复 1 次,并将收入类型标记为服务。否则,对于不是 PS-AFS 的所有其他记录,因此我的所有维护记录,将每条记录重复 12 次,并将收入类型标记为维护。感谢大家的帮助!

【问题讨论】:

【参考方案1】:

没有示例数据,我无法验证此代码,但它应该可以工作:

mask = df['GP Line Item Code:'] == 'PS-AFS'

out = pd.concat([df.loc[mask].assign(Revenue_Type='Sevice')] +
                [df.loc[~mask].assign(Revenue_Type='Maintenance')]*12)

然后您可以重命名列或创建新列。

【讨论】:

以上是关于通过数据框进行条件循环的主要内容,如果未能解决你的问题,请参考以下文章

使用条件将列更改为单独的数据框

使用字典和数据框通过循环创建具有变量名的新数组

通过要删除的行的多个逻辑条件子集数据帧

如何通过 executemany() 语句转换 pandas 数据框以进行插入?

循环通过过滤的数据框以查看值是不是在列表列中

python - 如何通过python中的键在循环中命名熊猫数据框?