如何调整复杂的数据框架

时间:2016-08-27 02:29:00

标签: python pandas 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是否包含每个合同。 也许枢轴是可用的,但我无法处理这种复杂的数据帧...... 我可以问一下如何改造吗?

3 个答案:

答案 0 :(得分:3)

更快的实施方法是将meltstr.get_dummies结合使用,如下所示:

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

答案 1 :(得分:1)

您可以将原始数据框格融合为长格式,然后在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

答案 2 :(得分:1)

我们也可以使用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