当列名和值在单行中时在 DataFrame 中赋值

Assigning values in DataFrame when columns names and values are in single row

我有两个如下所示的数据框,

import numpy as np
import pandas as pd

df1 = pd.DataFrame({1: np.zeros(5), 2: np.zeros(5)}, index=['a','b','c','d','e'])

df2 = pd.DataFrame({'category': [1,1,2,2], 'value':[85,46, 39, 22]}, index=[0, 1, 3, 4])

需要将第二个数据帧中的 value 分配到第一个数据帧中,以便保持索引和列关系。第二个数据帧索引基于 iloc 并且具有列 category,它实际上包含第一个数据帧的列名。 value 是要分配的值。

以下是我的预期输出解决方案,

for _category in df2['category'].unique():
    df1.loc[df1.iloc[df2[df2['category'] == _category].index.tolist()].index, _category]  = df2[df2['category'] == _category]['value'].values

有没有没有 for 循环的 pythonic 方法?

这是一种方法,将 df1 中的 0 替换为 NaN; pivotting df2 并用 df2:

填充 df1 中的 NaN
out = (df1.replace(0, pd.NA).reset_index()
       .fillna(df2.pivot(columns='category', values='value'))
       .set_index('index').rename_axis(None).fillna(0))

输出:

      1     2
a  85.0   0.0
b  46.0   0.0
c   0.0   0.0
d   0.0  39.0
e   0.0  22.0

一个选项是 pivot and update:

df3 = df1.reset_index()
df3.update(df2.pivot(columns='category', values='value'))
df3 = df3.set_index('index').rename_axis(None)

备选方案,重新索引 df2(分两步,数字和标签),以及 combine_first with df1:

df3 = (df2
 .pivot(columns='category', values='value')
 .reindex(range(max(df2.index)+1))
 .set_axis(df1.index)
 .combine_first(df1)
)

输出:

      1     2
a  85.0   0.0
b  46.0   0.0
c   0.0   0.0
d   0.0  39.0
e   0.0  22.0