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