我有一个数据集,我想在其中旋转第 2 列和第 3 列。 第 3 列是列名,第 2 列是它的值。 但是对于每个 id,col3 中可能存在重复值。
id | col2 | col3 |
---|---|---|
1 | a | 福 |
1 | e | 福 |
到
id | 福 | 福 |
---|---|---|
1 | a | e |
举个例子:
df = pd.DataFrame({'id': ['1', '1', '1', '1', '2', '1', '1'],
'col2': ['a', 'b', 'c', 'd', 'e', 'f', 'g'],
'col3': ['foo', 'bar', 'baz', 'foo', 'bar', 'biz', 'baz']})
由于我们不能在数据框中有 2 个同名的列,我尝试按 id 对它们进行分组并找到第二次出现,然后通过在末尾添加“2”来更新它。
df = pd.DataFrame({'id': ['1', '1', '1', '1', '2', '1', '1'],
'col2': ['a', 'b', 'c', 'd', 'e', 'f', 'g'],
'col3': ['foo', 'bar', 'baz', 'foo', 'bar', 'biz', 'baz']})
# Find rows with duplicate values in col3 for the same id
duplicated_rows = df[df.duplicated(subset=['id', 'col3'], keep=False)]
# Iterate over each group of duplicated rows and update the second occurrence
for id, group in duplicated_rows.groupby('id'):
mask = (group.index != group.index[0]) # Select the second occurrence
df.loc[mask, 'col3'] = df.loc[mask, 'col3'] + '2' # Update the value by adding '2'
print(df)
但是我得到这个错误: IndexError:布尔索引的长度错误:4 而不是 7
我们如何更新第二次出现? 也感谢任何其他解决方案。
pivot
:
out = (
df.assign(col3=df.groupby(["id", "col3"])
.cumcount().add(1).astype(str)
.radd("_").radd(df["col3"]))
.pivot(index="id", columns="col3", values="col2")
.rename_axis(None, axis=1).reset_index()
)
输出:
print(out)
id bar_1 baz_1 baz_2 biz_1 foo_1 foo_2
0 1 b c g f a d
1 2 e NaN NaN NaN NaN NaN