我在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)