如何在Python熊猫中重塑此数据集?

时间:2018-12-19 00:46:09

标签: python pandas pivot reshape munge

说我有一个像这样的数据集:

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
...

在原始数据集中,我将要素abc作为自己的单独列。在转换后的数据集中,这些相同的变量列在列feature下,并产生两个新列01,对应于这些要素可以采用的值。

is_a0的原始数据集中,添加infected值并将它们除以population值。在is_a1的情况下,执行相同操作,添加infected值,然后将其除以population值。冲洗并重复is_bis_c。如图所示,新的数据集将具有这些分数(或小数)。谢谢!

我已经尝试过pd.pivot_tablepd.melt,但是没有什么比我需要的更接近了。

3 个答案:

答案 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)

enter image description here