通常我能够通过浏览SO来解决我的问题。但是,我被困在这里。
假设我有一个如下所示的数据框:
import itertools
lst = range(1,3)
group_names = ["GROUP1","GROUP2","GROUP3"]
rng = pd.date_range('1/1/2011', periods=24, freq='H')
time_index = pd.Series(list(itertools.chain.from_iterable(itertools.repeat(rng, 3))), name="Time")
values = pd.Series(np.random.randn(len(time_index)), index=time_index, name="Values")
groups = pd.Series(list(itertools.chain.from_iterable(itertools.repeat(x, 24) for x in group_names)), index=time_index, name="Groups")
df = pd.concat([values, groups], axis=1)
数据框应该是这样的:
Values Groups
Time
2011-01-01 00:00:00 0.339785 GROUP1
2011-01-01 01:00:00 0.384126 GROUP1
2011-01-01 02:00:00 -0.096264 GROUP1
...
2011-01-01 01:00:00 1.448881 GROUP2
2011-01-01 02:00:00 1.448881 GROUP2
2011-01-01 03:00:00 1.448881 GROUP2
2011-01-01 04:00:00 -0.256500 GROUP2
2011-01-01 05:00:00 -1.818228 GROUP2
请注意,时间索引是24小时,但始终是同一天。我想实现“组”列中的每个唯一组都将作为新列插入,其中包含“值”列的相应值。现在所有列都在同一时间索引上合并。
渴望的结果:
df2 = pd.DataFrame(np.random.randn(24, 3), columns=group_names, index=rng)
GROUP1 GROUP2 GROUP3
2011-01-01 00:00:00 -0.144325 -0.883371 2.245540
2011-01-01 01:00:00 -0.311808 -0.854769 0.229355
2011-01-01 02:00:00 0.983453 -1.741552 2.409349
2011-01-01 03:00:00 0.303125 -1.363857 0.484512
...
2011-01-01 19:00:00 1.129852 1.374176 -0.639436
2011-01-01 20:00:00 -0.793817 -1.834729 -0.089721
2011-01-01 21:00:00 1.389437 -1.198244 -0.430752
2011-01-01 22:00:00 0.321585 -0.107011 -0.083659
2011-01-01 23:00:00 0.886643 -0.390729 -2.380853
到目前为止,我已经尝试了几次尝试,从groupby开始到一个简单的循环。
for group in df.Groups.unique():
df[group ] = df[(df2.Groups== group )]["Value"]
然而,这导致所有重复索引的NaN。
我希望我的解释足够明确。
有人有想法吗?