【发布时间】:2014-09-05 17:15:33
【问题描述】:
我有一个大的pandas.DataFrame,看起来像这样:
test = pandas.DataFrame({"score": numpy.random.randn(10)})
test["name"] = ["A"] * 3 + ["B"] * 3 + ["C"] * 4
test.index = range(3) + range(3) + range(4)
id 分数名称
0 -0.652909 A
1 0.100885 A
2 0.410907 A
0 0.304012 乙
1 -0.198157 B
2 -0.054764 乙
0 0.358484 C
1 0.616415 C
2 0.389018 C
3 1.164172 C
因此,如果我按列 name 分组,索引是非唯一的,但它是唯一的。我想按名称将数据框拆分为多个小节,然后(通过外部连接)将分数列组装成一个新的大数据框,并将分数的列名更改为相应的组键。我目前拥有的是:
df = pandas.DataFrame()
for (key, sub) in test.groupby("name"):
df = df.join(sub["score"], how="outer")
df.columns.values[-1] = key
这会产生预期的结果:
id A B C 0 -0.652909 0.304012 0.358484 1 0.100885 -0.198157 0.616415 2 0.410907 -0.054764 0.389018 3 南南 1.164172但似乎不是很pandas-ic。有没有更好的办法?
编辑:根据答案,我进行了一些简单的计时。
%%timeit
df = pandas.DataFrame()
for (key, sub) in test.groupby("name"):
df = df.join(sub["score"], how="outer")
df.columns.values[-1] = key
100 次循环,最好的 3 次:每次循环 2.46 毫秒
%%timeit
test.set_index([test.index, "name"]).unstack()
1000 次循环,最好的 3 次:每个循环 1.04 毫秒
%%timeit
test.pivot_table("score", test.index, "name")
100 次循环,最好的 3 次:每次循环 2.54 毫秒
所以unstack 似乎是首选方法。
【问题讨论】:
-
下一次,您应该提供一个
numpy种子,以便数字与您的预期结果相同。 -
虽然这个问题并不重要,但感谢@FooBar 的提示。
标签: python pandas merge group-by outer-join