在索引上使用groupby获取每个索引的元素列表,使用to_dict获取字典,然后使用pd.DataFrame构造函数:
pd.DataFrame(df.groupby(level=0)['column_name'].apply(list).to_dict())
如果你有一个系列,比如s,而不是 DataFrame,你不需要提供列名:
pd.DataFrame(s.groupby(level=0).apply(list).to_dict())
结果输出:
row1 row2
0 10 9
1 11 8
时间
使用以下设置生成更大的样本数据,假设输入数据是一个DataFrame:
n = 10**6
df = pd.DataFrame(np.random.random(size=n), index=['row1', 'row2']*(n//2))
def pir2(s):
s.index = [s.groupby(level=0).cumcount(), s.index]
return s.unstack()
我得到以下时间:
%timeit pd.DataFrame(df.groupby(level=0)[0].apply(list).to_dict())
1 loop, best of 3: 210 ms per loop
%timeit pir2(df.copy())
1 loop, best of 3: 486 ms per loop
%timeit df.assign(id = df.groupby([0]).cumcount()).set_index(['id', 0]).unstack(level=1)
1 loop, best of 3: 1.34 s per loop