我在Pandas中拥有第一个数据框,我正尝试将其重塑为第二个数据框,以进行有监督的机器学习。 [foo,bar]
代表一个数据点;每个id
都有一个明确的标签[dog,cat]
和多个数据点。最终的数据帧最多包含3个数据点,这些数据点按照最初给出的顺序使用截断或零填充来实现此目标。
foo bar dog cat id
0 1.1 1.6 0 1 12
1 2.3 2.4 0 1 12
2 4.5 4.2 0 1 12
3 2.3 1.2 0 1 12
4 4.2 3.8 1 0 535
5 1.6 4.1 1 0 535
...
id foo1 bar1 foo2 bar2 foo3 bar3 dog cat
12 1.1 1.6 2.3 2.4 4.5 4.2 0 1
535 4.2 3.8 1.6 4.1 0 0 1 0
...
我曾尝试致电pd.pivot()
,pd.stack()
和pd.unstack()
,但是我什么都没得到。我也无法在Pandas reshaping docs上找到我想做的事情。我将不胜感激,因为我对编程没有足够的经验。
答案 0 :(得分:1)
使用pivot_table
+ cumcount
:
df2 = (df.pivot_table(index='id', columns=df.groupby('id').cumcount().add(1),
aggfunc='first', fill_value=0)
.sort_index(axis=1, level=1))
df2 = (df2.set_axis([f'{x}{y}' for x, y in df2.columns],
axis=1)
.reset_index())
print(df2)
或者:
df2 = (df.assign(groups_id=df.groupby('id').cumcount().add(1))
.set_index(['id', 'groups_id'])
.unstack(fill_value=0).sort_index(level=1, axis=1))
df2 = (df2.set_axis([f'{x}{y}' for x, y in df2.columns],
axis=1)
.reset_index())
print(df2)
输出
id bar1 cat1 dog1 foo1 bar2 cat2 dog2 foo2 bar3 cat3 dog3 \
0 12 1.6 1 0 1.1 2.4 1 0 2.3 4.2 1 0
1 535 3.8 0 1 4.2 4.1 0 1 1.6 0.0 0 0
foo3 bar4 cat4 dog4 foo4
0 4.5 1.2 1 0 2.3
1 0.0 0.0 0 0 0.0