如何对复杂的数据框架进行透视[英] how to pivot complex dataframe

本文是小编为大家收集整理的关于如何对复杂的数据框架进行透视的处理方法,想解了如何对复杂的数据框架进行透视的问题怎么解决?如何对复杂的数据框架进行透视问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我在下面显示了一个数据框.

df =pd.DataFrame({'ID': [1, 2, 3, 4, 5], 'contract1' :["A", "B", "C", "D", "B"],
           'contract2' :["C", "A", np.nan, "A", np.nan],
           'contract3' :[np.nan, "C", np.nan, np.nan, np.nan] })
df

ID        contract1   contract2   contract3    
1             A           C         nan
2             B           A          C
3             C          nan        nan
4             D           A         nan
5             B          nan        nan

我想要这样的标志结果;

ID     A     B     C      D
1      1     0     1      0
2      1     1     1      0 
3      0     0     1      0
4      1     0     0      1
5      0     1     0      0  

此标志表显示每个ID是否具有每个合同. 也许可以使用Pivot,但是我无法处理这种复杂的数据框架... 我可以问一下如何转换吗?

推荐答案

更快的实现将是使用 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.series.str.str.get_dummies.html" 如图所示:

pd.melt(df, id_vars=['ID']).set_index('ID')['value']        \
                           .str.get_dummies()               \
                           .groupby(level=0)                \
                           .agg(np.sum)

    A  B  C  D
ID            
1   1  0  1  0
2   1  1  1  0
3   0  0  1  0
4   1  0  0  1
5   0  1  0  0

其他推荐答案

您可以将原始数据框架融化为长格式,然后在ID和值列上使用crosstab():

import pandas as pd
df1 = df.set_index('ID').stack().rename("Type").reset_index()    
pd.crosstab(df1.ID, df1.Type)

# Type  A   B   C   D
#   ID              
#   1   1   0   1   0
#   2   1   1   1   0
#   3   0   0   1   0
#   4   1   0   0   1
#   5   0   1   0   0

其他推荐答案

我们也可以使用melt/pivot_table

做到这一点
res = pd.melt(df, id_vars = ['ID'], value_vars = ['contract1', 
       'contract2', 'contract3']).pivot_table(index = 'ID', 
          columns = 'value', fill_value = 0, aggfunc=len)
print(res)
#    variable         
#value        A  B  C  D
#ID                     
#1            1  0  1  0
#2            1  1  1  0
#3            0  0  1  0
#4            1  0  0  1
#5            0  1  0  0

数据

import pandas as pd;
import numpy as np;
df =pd.DataFrame({'ID': [1, 2, 3, 4, 5], 'contract1' :["A", "B", "C", "D", "B"],
           'contract2' :["C", "A", np.nan, "A", np.nan],
           'contract3' :[np.nan, "C", np.nan, np.nan, np.nan] })
df

本文地址:https://www.itbaoku.cn/post/1728217.html