繁体   English   中英

将聚合行分成不同的行,在 pandas 中添加唯一计数

[英]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 ,可以reindexrepeat以下操作。 请记住,对于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM