【问题标题】:How to split one column into multiple columns, based on similar values如何根据相似的值将一列拆分为多列
【发布时间】:2018-01-11 04:50:36
【问题描述】:

在这个数据框(一个更大的数据框的一部分)中,我想将蓝色与红色分开,以便它们位于两个不同的列上。 (每个人只有两种颜色。)

        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

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

【问题讨论】:

    标签: python pandas matplotlib seaborn


    【解决方案1】:

    我们需要使用str.split的新para Key

    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
    

    【讨论】:

    • 我们可以用df.shape[1]//2代替int(df.shape[1]/2)
    • 我想出了这个。但是你可能不用钥匙就可以做到。 v = df.groupby(df.Person.str.split('_').str[0]).apply(pd.Series.tolist) 然后pd.DataFrame(np.concatenate(v.tolist(), axis=1))
    • 然后只需设置列。
    • @cᴏʟᴅsᴘᴇᴇᴅ 是的,简洁:-)
    • @AdamSchroeder 我的方法和cold的方法是必需的,原来的df已经排序好,如果不是这样会产生问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 2016-04-10
    • 2023-04-01
    • 2020-02-10
    相关资源
    最近更新 更多