[英]Separate aggregated row into distinct rows, adding a unique count in pandas
我有一个包含多行和多列的数据集,但是在标记为“活动”的列中,我希望删除聚合并将其分成自己的唯一计数。 我还希望添加一列,为该计数提供唯一 ID。
数据
Pair gen box date active
sox black bl 2021 3
sox red re 2021 2
期望的
Pair gen box date active count
sox black bl 2021 1 b101
sox black bl 2021 1 bl02
sox black bl 2021 1 bl02
sox red re 2021 1 re01
sox red re 2021 1 re02
'active' 列现在分别有 3 和 2 个不同的行,以及不同的计数 ID(基于 'box' 列)而不是聚合。
正在做
一个 SO 帮助解决了类似的困境,我正在采用这种方法:
# Melt Table Into New Form
df = df.melt(col_level=0, value_name='count', var_name='bl')
# Repeat Based on Count
df = df.reindex(df.index.repeat(df['count']))
# Set Count To 1
df['count'] = 1
# Add Suffix to Each ID
df['ID'] = df['ID'] + (
(df.groupby('ID').cumcount() + 1)
.astype(str)
.str.zfill(2)
)
这可行,但是,我无法保留其他列以及设置单独的 var 名称,例如:
bl01
bl02
re01
re02
任何建议或意见表示赞赏
您不需要为这个问题melt
,可以reindex
并repeat
以下操作。 请记住,对于count
列,我意识到如果每个组的大小 > 10
,那么当您真正想要bl10
时,它将显示为bl010
作为示例。 数字格式适用于提供的样本数据,尽管组大小小于 10,并且组大小 > 10,尚不清楚所需的 output 是什么:
df = df.reindex(df.index.repeat(df['active'])).assign(active=1)
df['count'] = df['box'] + '0' + (df.groupby(['Pair', 'gen', 'box']).cumcount() + 1).astype(str)
df
Out[1]:
Pair gen box date active count
0 sox black bl 2021 1 bl01
0 sox black bl 2021 1 bl02
0 sox black bl 2021 1 bl03
1 sox red re 2021 1 re01
1 sox red re 2021 1 re02
另一种方法是沿您的轴连接,然后使用 cumcount 创建您的计数列。
dfs = pd.concat([pd.concat([y.assign(active=1,)] * act)
for (idx,act),y in df.groupby([df.index, df['active']])])
dfs['count'] = dfs['box'] + (dfs.groupby('box').cumcount() + 1).astype(str).str.zfill(2)
print(dfs)
Pair gen box date active count
0 sox black bl 2021 1 bl01
0 sox black bl 2021 1 bl02
0 sox black bl 2021 1 bl03
1 sox red re 2021 1 re01
1 sox red re 2021 1 re02
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.