当列名和值在单行中时在 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; pivot
ting 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
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
我有两个如下所示的数据框,
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; pivot
ting 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
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