これは古い質問ですが、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列×6k行で、展開すると100,000行まで7秒かかります。この場合、すべての列をグループ化するため、グループ化が必要か賢明かはわかりませんが、7秒だけです。