我知道這是一個老問題,但我有麻煩讓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秒即可。
我還記得一個通用函數,它允許根據'count'列中的值返回多個,一個或零個行。 – btel
如果您在2017+中遇到此問題,請查看我的答案以獲得更有效且直接的解決方案。 –