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



我在excel文件中有数据,df为每个ID保存聚合值。我希望将其分解为不同的计数,并为每个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))

我想我可以这样做,然而,这并不是连续地堆叠所有必要的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)

最新更新