如何根据相似的值

时间:2018-01-08 17:31:06

标签: python pandas matplotlib seaborn

在这个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

有没有办法解决这个问题,所以所有的红色都在一列之下而蓝色在另一列之下?

1 个答案:

答案 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