说我有一个像这样的数据集:
is_a is_b is_c population infected
1 0 1 50 20
1 1 0 100 10
0 1 1 20 10
...
我如何重塑它看起来像这样?
feature 0 1
a 10/20 30/150
b 20/50 20/120
c 10/100 30/70
...
在原始数据集中,我将要素a
,b
和c
作为自己的单独列。在转换后的数据集中,这些相同的变量列在列feature
下,并产生两个新列0
和1
,对应于这些要素可以采用的值。
在is_a
为0
的原始数据集中,添加infected
值并将它们除以population
值。在is_a
为1
的情况下,执行相同操作,添加infected
值,然后将其除以population
值。冲洗并重复is_b
和is_c
。如图所示,新的数据集将具有这些分数(或小数)。谢谢!
我已经尝试过pd.pivot_table
和pd.melt
,但是没有什么比我需要的更接近了。
答案 0 :(得分:6)
完成wide_to_long
之后,您的问题会更加清楚
df=pd.wide_to_long(df,['is'],['population','infected'],j='feature',sep='_',suffix='\w+').reset_index()
df
population infected feature is
0 50 20 a 1
1 50 20 b 0
2 50 20 c 1
3 100 10 a 1
4 100 10 b 1
5 100 10 c 0
6 20 10 a 0
7 20 10 b 1
8 20 10 c 1
df.groupby(['feature','is']).apply(lambda x : sum(x['infected'])/sum(x['population'])).unstack()
is 0 1
feature
a 0.5 0.200000
b 0.4 0.166667
c 0.1 0.428571
答案 1 :(得分:2)
我在您的小型数据框上尝试过此操作,但是我不确定它是否可以在较大的数据集上使用。
dic_df = {}
for letter in ['a', 'b', 'c']:
dic_da = {}
dic_da[0] = df[df['is_'+str(letter)] == 0].infected.sum()/df[df['is_'+str(letter)] == 0].population.sum()
dic_da[1] = df[df['is_'+str(letter)] == 1].infected.sum()/df[df['is_'+str(letter)] == 1].population.sum()
dic_df[letter] = dic_da
dic_df
dic_df_ = pd.DataFrame(data = dic_df).T.reset_index().rename(columns= {'index':'feature'})
feature 0 1
0 a 0.5 0.200000
1 b 0.4 0.166667
2 c 0.1 0.428571
答案 2 :(得分:1)
在这里,DF将是您的原始DataFrame
Aux_NewDF = [{'feature': feature,
0 : '{}/{}'.format(DF['infected'][DF['is_{}'.format(feature.lower())]==0].sum(), DF['population'][DF['is_{}'.format(feature.lower())]==0].sum()),
1 : '{}/{}'.format(DF['infected'][DF['is_{}'.format(feature.lower())]==1].sum(), DF['population'][DF['is_{}'.format(feature.lower())]==1].sum())} for feature in ['a','b','c']]
NewDF = pd.DataFrame(Aux_NewDF)