Python 透视表的多类别1热编码

Python 透视表的多类别1热编码,python,pandas,categories,categorical-data,Python,Pandas,Categories,Categorical Data,我有一些数据主要由一个热编码的分类数据组成。我希望能够证明这些类别同时出现,但我不太清楚如何重塑或计算它们。我的主要问题是,尽管我有独特的案例,但类别是非排他性的,这意味着在本例中,每个案例可能被分类为多个国家和多个问题 case_id country.france country.germany issue.water issue.health issue.poverty 0 0 1 1 0

我有一些数据主要由一个热编码的分类数据组成。我希望能够证明这些类别同时出现,但我不太清楚如何重塑或计算它们。我的主要问题是,尽管我有独特的案例,但类别是非排他性的,这意味着在本例中,每个案例可能被分类为多个国家和多个问题

case_id country.france  country.germany issue.water issue.health    issue.poverty
    0           0           1              1            0               1
    1           1           1              0            1               1
    2           1           1              0            1               1
    3           1           0              1            1               1
期望输出-一个数据透视表,显示国家类别和问题类别之间的共现计数:

                    issue.water issue.health    issue.poverty
country.france          1             3               3
country.germany         1             2               3
我已尝试重塑我的数据,使我的数据看起来更像

case_id   country   issue
0        germany    water
0        germany    poverty
1        france     health
1        france     poverty
2        france     health
2        france     poverty
2        germany    health
2        germany    poverty
3        france     water
3        france     health
3        france     poverty
但我不清楚如何将其转化为所需的输出,或者这是否是处理多类别案件的正确方法。我有代码,但到目前为止都是关于重塑的,在我知道我是否采取正确的方法处理每个案例的多个类别之前,我不确定我是否应该以重塑为目标


如果能帮我解决这个问题,我将不胜感激

在重塑的数据帧上(如果
df
),您可以尝试以下操作:

p = pd.pivot_table(df, index='country', columns='issue', aggfunc="count")
# setting column names
p.columns = [c.replace('case_id', 'issue.')for c in map("".join, p.columns)]

在重塑的数据帧(如果
df
)上,您可以尝试以下操作:

p = pd.pivot_table(df, index='country', columns='issue', aggfunc="count")
# setting column names
p.columns = [c.replace('case_id', 'issue.')for c in map("".join, p.columns)]

在您重塑您的
df

pd.crosstab(df.country,df.issue)
Out[306]: 
issue    health  poverty  water
country                        
france        3        3      1
germany       1        2      1
或更多相关人员使用
wide\u to\u long

newdf=pd.wide_to_long(df1,['issue'],i='case_id',j='issueid',suffix='\\w+',sep='.').set_index('issue',append=True).sum(level=[1,2]).query('issue==1')
newdf.reset_index(level=1,drop=True).T
Out[326]: 
issueid          water  health  poverty
country.france       1       3        3
country.germany      1       2        3

在您重塑您的
df

pd.crosstab(df.country,df.issue)
Out[306]: 
issue    health  poverty  water
country                        
france        3        3      1
germany       1        2      1
或更多相关人员使用
wide\u to\u long

newdf=pd.wide_to_long(df1,['issue'],i='case_id',j='issueid',suffix='\\w+',sep='.').set_index('issue',append=True).sum(level=[1,2]).query('issue==1')
newdf.reset_index(level=1,drop=True).T
Out[326]: 
issueid          water  health  poverty
country.france       1       3        3
country.germany      1       2        3

最后,我选择了一种不同的方法,因为我的实际用例与我在这里展示的简单用例有点不同。但这是帮助我更好地思考的答案,所以谢谢!最后,我选择了一种不同的方法,因为我的实际用例与我在这里展示的简单用例有点不同。但这是帮助我更好地思考的答案,所以谢谢!