繁体   English   中英

将聚合值拆分为 python 中的不同计数,返回新行

[英]Split an aggregated value into a distinct count in python, returning new rows

我在 excel 文件中有数据,df 包含每个 ID 的聚合值。 我希望将其分解为不同的数量,并为每个数量创造一个新记录。

数据

    A    B    C

    2    3    1

期望的

 count   ID

  1      A01

  1      A02
  
  1      B01

  1      B02

  1      B03

  1      C01

正在做:

import pandas as pd
from numpy.random import randint

df = pd.DataFrame(columns=['A', 'B', 'C'])
     for i in range(5):
     df.loc[i] = ['ID' + str(i)] + list(randint(10, size=2))

我想我可以通过这种方式 go ,但是,这并不是连续堆叠所有必要的 ID。

任何建议或意见将不胜感激。

让我们尝试使用melt重塑数据, reindex + repeat复制行, groupby + cumcount + zfill创建后缀:

import pandas as pd

df = pd.DataFrame({'A': {0: 2}, 'B': {0: 3}, 'C': {0: 1}})

# Melt Table Into New Form
df = df.melt(col_level=0, value_name='count', var_name='ID')
# 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)
)

# Reorder Columns
df = df[['count', 'ID']]

print(df)

df

   count   ID
0      1  A01
0      1  A02
1      1  B01
1      1  B02
1      1  B03
2      1  C01

你想要这个吗?

df = pd.DataFrame([[f"{k}{str(i+1).zfill(2)}" for i in range(v)]
              for k, v in df.to_dict('records')[0].items()]).stack().reset_index(drop=True).to_frame().rename(columns = {0:'ID'})
df['count'] = 1

另外的选择:

import numpy as np
df = df.melt()
new_df = (pd.DataFrame(np.repeat(df.variable, df.value))
        .assign(count=1))
new_df.variable = new_df.variable + (new_df.groupby('variable').cumcount() + 1).astype(str).str.zfill(2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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