我知道这是一个老问题,但我无法让 Wes 的答案适用于数据框中的多个列,所以我让他的代码更通用一些。以为我会分享,以防其他人在这个问题上遇到同样的问题。
您基本上只需指定其中包含计数的列,然后您会得到一个扩展的数据框作为回报。
import pandas as pd
df = pd.DataFrame({'class 1': ['A','B','C','A'],
'class 2': [ 1, 2, 3, 1],
'count': [ 3, 3, 3, 1]})
print df,"\n"
def f(group, *args):
row = group.irow(0)
Dict = {}
row_dict = row.to_dict()
for item in row_dict: Dict[item] = [row[item]] * row[args[0]]
return pd.DataFrame(Dict)
def ExpandRows(df,WeightsColumnName):
df_expand = df.groupby(df.columns.tolist(), group_keys=False).apply(f,WeightsColumnName).reset_index(drop=True)
return df_expand
df_expanded = ExpandRows(df,'count')
print df_expanded
回报:
class 1 class 2 count
0 A 1 3
1 B 2 3
2 C 3 3
3 A 1 1
class 1 class 2 count
0 A 1 1
1 A 1 3
2 A 1 3
3 A 1 3
4 B 2 3
5 B 2 3
6 B 2 3
7 C 3 3
8 C 3 3
9 C 3 3
关于速度,我的基本 df 是 10 列 x 约 6k 行,当扩展为约 100,000 行时需要约 7 秒。在这种情况下,我不确定分组是必要的还是明智的,因为它会将所有列都分组,但是无论如何只有 7 秒。