【问题标题】:In Pandas, how can I split a column based in a value from another column?在 Pandas 中,如何根据另一列的值拆分列?
【发布时间】:2019-11-09 03:01:51
【问题描述】:

我想离开这个数据框结构:

df = pd.DataFrame({'col1':['a','a','b','b','c','c'],
               'col2':['str_a1','str_a2','str_b1','str_b2','str_c1','str_c2']})

df

到这个

df2 = pd.DataFrame({'col1_1':['a','b','c'],
                'col2_1':['str_a1','str_b1','str_c1'],
                'col2_2':['str_a2','str_b2','str_c2']})
df2

有没有办法在 pandas 中实现这一点?

【问题讨论】:

    标签: python pandas split multiple-columns


    【解决方案1】:

    使用 assignpivotadd_prefix

    s = df.groupby('col1').cumcount().add(1)
    df_out =  (df.assign(n=s).pivot('col1', 'n', 'col2').add_prefix('col2_')
                 .reset_index())
    
    Out[32]:
    n col1  col2_1  col2_2
    0    a  str_a1  str_a2
    1    b  str_b1  str_b2
    2    c  str_c1  str_c2
    

    或者set_indexpivotT

    s = df.groupby('col1').cumcount().add(1)
    df_out = (df.set_index(s).pivot(columns='col1', values='col2')
                .rename(lambda x: f'col2_{x}').T.reset_index())
    
    Out[75]:
      col1  col2_1  col2_2
    0    a  str_a1  str_a2
    1    b  str_b1  str_b2
    2    c  str_c1  str_c2
    

    【讨论】:

    • 谢谢!它就像一个魅力。我只做一个观察:在创建数据框s 时,没有必要包含.add(1)。我赞成你的答案,并认为它是正确的。
    【解决方案2】:

    让我们尝试一下,将set_indexgroupbycumcount 一起使用,然后使用unstack 重塑形状并展平多索引列标题:

    df_out = df.set_index(['col1', df.groupby('col1').cumcount() + 1]).unstack()
    df_out.columns = [f'{i}_{j}' for i, j in df_out.columns]
    print(df_out.reset_index())
    

    输出:

      col1  col2_1  col2_2
    0    a  str_a1  str_a2
    1    b  str_b1  str_b2
    2    c  str_c1  str_c2
    

    【讨论】:

    • 谢谢。尽管使用的功能比 Andy L 的答案更多,但它运行良好。我投了赞成票。
    【解决方案3】:

    如果您的 'col1' 重复相同的次数,那么您可以使用下面的 numpy reshape 来获得结果

    df = pd.DataFrame({'col1':['a','a','b','b','c','c'],
                   'col2':['str_a1','str_a2','str_b1','str_b2','str_c1','str_c2']})
    
    ## 4 is square of number of repeates in this case 2*2
    ar = df.values.reshape(-1, 4)
    result = pd.DataFrame(np.c_[ar[:,0], ar[:,1::2]], columns=["col1_1", "col2_1", "col2_2"])
    result
    

    【讨论】:

      猜你喜欢
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 2023-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多