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

2022-01-22 00:00:00 python pandas dataframe pivot transpose

问题描述

df1 = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two', 'two'],
                    'bar': ['A', 'B', 'C', 'A', 'B', 'C']})

<头>
酒吧
0一个一个
1一个B
2一个C
3两个一个
4两个B
5两个C

我想把它转换成

<头>
val1val2val3
一个一个BC
两个一个BC

我试过的代码是:

pd.pivot_table(df1,index='foo',aggfunc=['first'])

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

But the above code is returning only the first value


解决方案

我们可以用 groupby cumcount 并将其用作枢轴列,然后 add_prefix 到数值和 reset_index 返回 'foo' 值到列:

We can enumerate groups with groupby cumcount and use those as the pivot columns then add_prefix to the numerical values and reset_index to return the 'foo' values to the columns:

new_df = (
    df1.pivot_table(index='foo',
                    columns=df1.groupby('foo').cumcount() + 1,
                    values='bar', 
                    aggfunc='first')
        .add_prefix('val')
        .reset_index()
)

   foo val1 val2 val3
0  one    A    B    C
1  two    A    B    C


看看 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

生成上述DataFrame的代码:

Code to generate the above DataFrame:

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

相关文章