我有一个数据集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,因为在最终输出中不需要它们。
接下来,通过设置为索引和压缩,将数据帧移动到一个序列中。
这允许我们用count
来repeat
系列。
之后,我们得到每组的计数,然后将它们合并为一列
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))