使用python扩展、转置和反聚合数据集



我有一个数据集df,其中有几个类别,每个类别都有数字计数。我想转换这个集合,并显示每个类别的不同计数。我还想添加一个新的"计数"列。新生成的计数从日期列中消失。示例ID A:2的q1中有多少不同的字母,依此类推

数据

ID  date    alpha   beta    gamma   
A   q1      2       2       1   
B   q1      2       2       3   
C   q1              
D   q2      2                   

所需

ID  type    date    count           
A   alpha   q1      alpha1          
A   alpha   q1      alpha2          
A   beta    q1      beta1           
A   beta    q1      beta2           
A   gamma   q1      gamma1          
B   alpha   q1      alpha1          
B   alpha   q1      alpha2          
B   beta    q1      beta1           
B   beta    q1      beta2           
B   gamma   q1      gamma1          
B   gamma   q1      gamma2          
B   gamma   q1      gamma3          
C
D   alpha   q2      alpha1
D   alpha   q2      alpha2                  

执行

我相信除了melt函数外,我可能还必须使用下面的代码。

df.melt(id_vars= ['ID', 'date'],
var_name = 'type',
value_name = 'count'

然而,我无法将值扩展为不同的计数

任何建议都会有所帮助。我还在研究这个。

熔化数据帧

df=pd.melt(df.replace("",0), id_vars=['ID','date'], value_vars=['alpha', 'beta', 'gamma']).sort_values(by='ID')

按列值的值重复行

newdf = (pd.DataFrame(np.repeat(df.values,df.value.astype(int),axis=0))).rename(columns={0:'ID',1:'date',2:'type',3:'count'})

更新计数以在每个ID 中具有类型的concat和类型的计数

newdf=newdf.assign(count=newdf['type']+(newdf.groupby(['ID','type'])['type'].cumcount()+1).astype(str))

ID date   type   count
0   A   q1  alpha  alpha1
1   A   q1  alpha  alpha2
2   A   q1   beta   beta1
3   A   q1   beta   beta2
4   A   q1  gamma  gamma1
5   B   q1  alpha  alpha1
6   B   q1  alpha  alpha2
7   B   q1   beta   beta1
8   B   q1   beta   beta2
9   B   q1  gamma  gamma1
10  B   q1  gamma  gamma2
11  B   q1  gamma  gamma3
12  D   q2  alpha  alpha1
13  D   q2  alpha  alpha2

使用panda版本1.2.4。。。

首先我们融化,然后去掉null,因为在最终输出中不需要它们。

接下来,通过设置为索引和压缩,将数据帧移动到一个序列中。

这允许我们用countrepeat系列。

之后,我们得到每组的计数,然后将它们合并为一列

temp = (df.melt(['ID', 'date'],  
ignore_index = False, 
value_name = 'count')
.dropna()
.sort_index()
.set_index(['ID', 'date', 'variable'], append = True)
.squeeze())
(temp.repeat(temp)
.reset_index(['ID', 'date', 'variable'])
.assign(count = lambda df: df.variable + 
df.groupby(['ID', 'variable'])
.variable.cumcount()
.add(1)
.astype(str))
.reset_index(drop = True))

ID date variable   count
0   A   q1    alpha  alpha1
1   A   q1    alpha  alpha2
2   A   q1     beta   beta1
3   A   q1     beta   beta2
4   A   q1    gamma  gamma1
5   B   q1    alpha  alpha1
6   B   q1    alpha  alpha2
7   B   q1     beta   beta1
8   B   q1     beta   beta2
9   B   q1    gamma  gamma1
10  B   q1    gamma  gamma2
11  B   q1    gamma  gamma3
12  D   q2    alpha  alpha1
13  D   q2    alpha  alpha2

另一种方式:

df = df.set_index(['ID', 'date']).stack().astype(int).apply(range).explode().reset_index(
name='count').assign(count=lambda x: x.level_2 + (x['count'] + 1).astype(str))

相关内容

  • 没有找到相关文章

最新更新