我有以下数据框(一行示例):
四分之一 | 价值 | 分布 |
---|---|---|
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} |
我不清楚为什么每行的行为不是唯一的,而是在本例中对两行应用乘法两次,并且只取分布字典中的最后一个季度。
我的循环中缺少什么?如何使循环添加函数在每行迭代中唯一?
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}