在这个Dataframe(一个更大的数据帧)中,我想将蓝色与红色分开,因此它们位于两个不同的列上。 (每个人只有两种颜色。)
Person Buckets_used
0 Jerry_blue 180
1 Jerry_red 20
2 Tomba_blue 30
3 Tomba_red 600
我想在下面创建数据框,但我不确定如何。这里应该使用正则表达式还是有更高效的方法?
Person Buckets_used Person Buckets_used
0 Jerry_blue 180 Jerry_red 20
1 Tomba_blue 30 Tomba_red 600
当我尝试通过@Wen执行以下建议的解决方案时:
df=df.set_index('Key').groupby(level=0).apply(lambda x : np.concatenate(x.values.tolist())).apply(pd.Series)
我在错误的列中得到了一些值。
Person Buckets_used Person Buckets_used
0 Jerry_blue 180 Jerry_red 20
1 Tomba_red 600 Tomba_blue 30
有没有办法解决这个问题,所以所有的红色都在一列之下而蓝色在另一列之下?
答案 0 :(得分:3)
我们需要使用str.split
df['Key']=df.Person.str.split('_',expand=True)[0]
df
Out[37]:
Person Buckets_used Key
0 Jerry_blue 180 Jerry
1 Jerry_red 20 Jerry
2 Tomba_blue 30 Tomba
3 Tomba_red 600 Tomba
然后我们groupby
df=df.set_index('Key').groupby(level=0).apply(lambda x : np.concatenate(x.values.tolist())).apply(pd.Series)
df
Out[47]:
0 1 2 3
Key
Jerry Jerry_blue 180 Jerry_red 20
Tomba Tomba_blue 30 Tomba_red 600
然后我们创建列名
df.columns=['Person','Buckets_used']*int(df.shape[1]/2)
df
Out[53]:
Person Buckets_used Person Buckets_used
Key
Jerry Jerry_blue 180 Jerry_red 20
Tomba Tomba_blue 30 Tomba_red 600
更新了
df['Key']=df.Person.str.split('_',expand=True)[1]
df['Key1']=df.groupby('Key').cumcount()
df.set_index(['Key1','Key']).unstack()
Out[400]:
Person Buckets_used
Key blue red blue red
Key1
0 Jerry_blue Jerry_red 180 20
1 Tomba_blue Tomba_red 30 600