在 pandas / python 中迭代数据帧时根据列信息乘以行并更改列值

问题描述 投票:0回答:1

我有以下数据框(一行示例):

四分之一 价值 分布
2024年第二季度 0.5 {'2024Q1':91,'2024Q2':91}

我想将这一行乘以分布中列出的季度数量(此处为 2),然后将给出的值除以给定季度中天数的分布百分比(在本示例中为 50%)。因此,这一列的目标输出将如下所示:

季度 价值 分布
2024年第二季度 0.25 {'2024Q1':91,'2024Q2':91}
2024年第一季度 0.25 {'2024Q1':91,'2024Q2':91}

2 行,因为字典中的分布列提到了两个季度。 0.25 因为 0.5 * (91 * (91+91))。

以下代码返回正确的行数,但没有按预期编辑各个行,这意味着我得到两行,但这些行是相同的,但它们不应该是相同的。这是我的代码:

    rows_list = []

for index, row in df.iterrows():
        distribution = [[x[0], x[1]] for x in list(row[distribution].items())] # returns [["2024Q1",0.5],["2024Q2",0.5]]
        total_days = sum([x[1] for x in distribution])

        for quarter in distribution:
            percentage = quarter[1] / total_days            
            quarter.append(percentage)

            row[quarter] = quarter[0]                        
            row[value] = row[value] * quarter[2]
            rows_list.append(row)
        
new_df = pd.DataFrame(data=rows_list)

打印该行时,我看到我正在编辑它,但是当将其添加到 row_list 元素时,他似乎覆盖了两者中的季度并应用 %-division 两次,返回以下内容:

季度 价值 分布
2024年第二季度 0.125 {'2024Q1':91,'2024Q2':91}
2024年第二季度 0.125 {'2024Q1':91,'2024Q2':91}

我不清楚为什么每行的行为不是唯一的,而是在本例中对两行应用乘法两次,并且只取分布字典中的最后一个季度。

我的循环中缺少什么?如何使循环添加函数在每行迭代中唯一?

python pandas iteration
1个回答
0
投票

IIUC,您可以使用

json_normalize
,然后进行矢量除法/乘法,最终使用
melt
+
join
重塑:

df = pd.DataFrame({'quarter': ['2024Q2'],
                   'value': [0.5],
                   'distribution': [{'2024Q1': 91, '2024Q2': 91}]})

tmp = pd.json_normalize(df['distribution'])

out = (tmp.div(tmp.sum(axis=1), axis=0).mul(df['value'], axis=0)
          .melt(ignore_index=False, var_name='quarter', value_name='value')
          .join(df[['distribution']])
      )

输出:

  quarter  value                  distribution
0  2024Q1   0.25  {'2024Q1': 91, '2024Q2': 91}
0  2024Q2   0.25  {'2024Q1': 91, '2024Q2': 91}
© www.soinside.com 2019 - 2024. All rights reserved.