numpy Pandas groupby两列,使用特定列中的值创建新列[重复]

gpnt7bae  于 2023-01-17  发布在  其他
关注(0)|答案(2)|浏览(123)
    • 此问题在此处已有答案**:

How can I pivot a dataframe?(5个答案)
4小时前关门了。
各位,我有以下数据:

import pandas as pd
a = [[0, 4, 'a', 1], [0, 4, 'b', 1], [0, 2, 'a', 0.5], [0, 2, 'b', -1], [0, 2, 'c', 1]]
df = pd.DataFrame(a)
df.columns = ['x', 'y', 'features', 'values']

   x  y features  values
0  0  4        a     1.0
1  0  4        b     1.0
2  0  2        a     0.5
3  0  2        b    -1.0
4  0  2        c     1.0

我需要一个新的 Dataframe ,如下所示:

b = [[0, 4, 1, 1, 0], [0, 2, 0.5, -1, 1]]
df2 = pd.DataFrame(b)
df2.columns = ['x', 'y', 'a', 'b', 'c']

   x  y    a  b  c
0  0  4  1.0  1  0
1  0  2  0.5 -1  1

所以我必须使用groupby(['x ','y']),但是我如何继续呢?我希望特征列中的值成为新列,然后我使用'values'列中的值来填充这些列。请帮助我。

1l5u6lss

1l5u6lss1#

使用DataFrame.pivot_table

new_df = df.pivot_table(index=['x', 'y'],
                        columns='features', 
                        values='values', 
                        fill_value=0)\
           .reset_index()\
           .rename_axis(columns=None)
print(new_df)

   x  y    a  b  c
0  0  2  0.5 -1  1
1  0  4  1.0  1  0

或不带DataFrame.pivot_table

new_df = df.set_index(['x', 'y', 'features'])\
           .unstack('features', fill_value=0)\
           .reset_index()\
           .droplevel(0, axis=1)\
           .rename_axis(columns=None)
print(new_df)
zazmityj

zazmityj2#

基于pandas.DataFrame.pivot的另一种可能的解决方案是:

(df.pivot(index=['x', 'y'], columns='features')
 .droplevel(0, axis=1).rename_axis(None, axis=1)
 .reset_index().fillna(0))

或者,为了更简洁,我们可以使用janitor.pivot_wider

# pip install pyjanitor
from janitor import pivot_wider

(pivot_wider(df, index=['x', 'y'], names_from='features', values_from='values')
 .fillna(0))

输出:

x  y    a    b    c
0  0  2  0.5 -1.0  1.0
1  0  4  1.0  1.0  0.0

相关问题