如何根据python中的公共ID值将2列的垂直pandas表转换为水平表

vin*_*mar 7 python transpose pivot dataframe pandas

df1 = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two', 'two'],
                    'bar': ['A', 'B', 'C', 'A', 'B', 'C']})
Run Code Online (Sandbox Code Playgroud)
酒吧
0 一种
1
2 C
3 一种
4
5 C

我想将其转换为

值1 值2 val3
一种 C
一种 C

我试过的代码是:

pd.pivot_table(df1,index='foo',aggfunc=['first'])
Run Code Online (Sandbox Code Playgroud)

但是上面的代码只返回第一个值

Hen*_*ker 5

我们可以枚举组groupby cumcount并将它们用作枢轴列,然后add_prefix是数值并将reset_index'foo' 值返回到列:

new_df = (
    df1.pivot_table(index='foo',
                    columns=df1.groupby('foo').cumcount() + 1,
                    values='bar', 
                    aggfunc='first')
        .add_prefix('val')
        .reset_index()
)
Run Code Online (Sandbox Code Playgroud)
   foo val1 val2 val3
0  one    A    B    C
1  two    A    B    C
Run Code Online (Sandbox Code Playgroud)

看看如何df1.groupby('foo').cumcount() + 1制作列:

   foo  columns
0  one        1  # First instance of "one"
1  one        2  # Second instance of "one"
2  one        3  # Third instance of "one"
3  two        1
4  two        2
5  two        3
Run Code Online (Sandbox Code Playgroud)

生成上述DataFrame的代码:

demo_df = pd.DataFrame({
    'foo': df1['foo'],
    'columns': df1.groupby('foo').cumcount() + 1
})
Run Code Online (Sandbox Code Playgroud)