Python 在数据帧中转置两列或更多列

Python 在数据帧中转置两列或更多列,python,pandas,Python,Pandas,我有一个数据框,看起来像: PRIO Art Name Value 1 A Alpha 0 1 A Alpha 0 1 A Beta 1 2 A Alpha 3 2 B Theta 2 我如何转换数据帧,即我将所有唯一的名称作为一个列,并带有相应的值(请注意,我希望忽略重复的行)? 因此,在这种情况下: PRIO Art Alpha

我有一个数据框,看起来像:

PRIO   Art  Name      Value
1      A     Alpha     0
1      A     Alpha     0
1      A     Beta      1
2      A     Alpha     3
2      B     Theta     2 
我如何转换数据帧,即我将所有唯一的名称作为一个列,并带有相应的值(请注意,我希望忽略重复的行)? 因此,在这种情况下:

PRIO   Art  Alpha      Alpha_value  Beta   Beta_value  Theta Theta_value
1      A    1             0         1       1           NaN    NaN
2      A    1             3         NaN     NaN         NaN    NaN
2      B    NaN           NaN       NaN     NaN          1     2
这里有一种使用的方法。要记住一些棘手的事情:

  • 您需要同时指定
    'PRIO',Art'
    作为轴索引
  • 我们还可以使用两个聚合函数在一个调用中完成它
  • 我们必须重命名0级列以区分它们。因此,您需要交换级别并重命名


Groupby两次,第一次使用值透视名称和后缀。接下来,按相同的命令分组,并找到唯一的值。连接这两个列。在连接中,删除重复的列,并根据需要重命名其他列

g=df.groupby([ 'Art','PRIO', 'Name'])['Value'].\
first().unstack().reset_index().add_suffix('_value')

print(g.join(df.groupby(['PRIO', 'Art','Name'])['Value'].\
       nunique().unstack('Name').reset_index()).drop(columns=['PRIO_value','Art'])\
      .rename(columns={'Art_value':'Art'}))



 Name Art  Alpha_value  Beta_value  Theta_value  PRIO  Alpha  Beta  Theta
0      A          0.0         1.0          NaN     1    1.0   1.0    NaN
1      A          3.0         NaN          NaN     2    1.0   NaN    NaN
2      B          NaN         NaN          2.0     2    NaN   NaN    1.0

这是
pd.crosstab()
groupby()
的一个示例


只是一个小注释,在这里,
Name
的缺失值保存为0,无论我在哪里喜欢它作为
NaN
我知道它将是零,正如您所指出的。非常感谢。
print(out.reset_index())

   PRIO Art  Alpha_is_present  Beta_is_present  Theta_is_present  Alpha_value  \
0     1   A               1.0              1.0               NaN          0.0   
1     2   A               1.0              NaN               NaN          3.0   
2     2   B               NaN              NaN               1.0          NaN   

   Beta_value  Theta_value  
0         1.0          NaN  
1         NaN          NaN  
2         NaN          2.0
g=df.groupby([ 'Art','PRIO', 'Name'])['Value'].\
first().unstack().reset_index().add_suffix('_value')

print(g.join(df.groupby(['PRIO', 'Art','Name'])['Value'].\
       nunique().unstack('Name').reset_index()).drop(columns=['PRIO_value','Art'])\
      .rename(columns={'Art_value':'Art'}))



 Name Art  Alpha_value  Beta_value  Theta_value  PRIO  Alpha  Beta  Theta
0      A          0.0         1.0          NaN     1    1.0   1.0    NaN
1      A          3.0         NaN          NaN     2    1.0   NaN    NaN
2      B          NaN         NaN          2.0     2    NaN   NaN    1.0
df = pd.concat([pd.crosstab([df['PRIO'],df['Art']], df['Name']),df.groupby(['PRIO','Art','Name'])['Value'].sum().unstack().add_suffix('_value')],axis=1).reset_index()

df
|          |   Alpha |   Beta |   Theta |   Alpha_value |   Beta_value |   Theta_value |
|:---------|--------:|-------:|--------:|--------------:|-------------:|--------------:|
| (1, 'A') |       1 |      1 |       0 |             0 |            1 |           nan |
| (2, 'A') |       1 |      0 |       0 |             3 |          nan |           nan |
| (2, 'B') |       0 |      0 |       1 |           nan |          nan |             2 |