【问题标题】:How to split pandas.DataFrame by index order?如何按索引顺序拆分 pandas.DataFrame?
【发布时间】:2019-05-27 06:29:25
【问题描述】:

如果我有两个具有相同列的 pandas.DataFrame。

df1 = pd.DataFrame(np.random.rand(5, 6), columns=list('abcdef'))
df2 = pd.DataFrame(np.random.rand(5, 6), columns=list('abcdef'))

我将它们连接成一个:

df = pd.concat([df1, df2], ignore_index = False)

现在不会忽略索引值。

在不更改索引值的情况下执行一些数据操作后,我如何才能反转串联,以便再次得到两个数据帧的列表?

【问题讨论】:

    标签: python python-3.x pandas concatenation


    【解决方案1】:

    我建议在concat 中使用keys

    df = pd.concat([df1, df2], ignore_index = False,keys=['df1','df2'])
    df
    Out[28]: 
                  a         b         c         d         e         f
    df1 0  0.426246  0.162134  0.231001  0.645908  0.282457  0.715134
        1  0.973173  0.854198  0.419888  0.617750  0.115466  0.565804
        2  0.474284  0.757242  0.452319  0.046627  0.935915  0.540498
        3  0.046215  0.740778  0.204866  0.047914  0.143158  0.317274
        4  0.311755  0.456133  0.704235  0.255057  0.558791  0.319582
    df2 0  0.449926  0.330672  0.830240  0.861221  0.234013  0.299515
        1  0.552645  0.620980  0.313907  0.039247  0.356451  0.849368
        2  0.159485  0.620178  0.428837  0.315384  0.910175  0.020809
        3  0.687249  0.824803  0.118434  0.661684  0.013440  0.611711
        4  0.576244  0.915196  0.544099  0.750581  0.192548  0.477207
    

    转换回来

    df1,df2=[y.reset_index(level=0,drop=True) for _, y in df.groupby(level=0)]
    df1
    Out[30]: 
              a         b         c         d         e         f
    0  0.426246  0.162134  0.231001  0.645908  0.282457  0.715134
    1  0.973173  0.854198  0.419888  0.617750  0.115466  0.565804
    2  0.474284  0.757242  0.452319  0.046627  0.935915  0.540498
    3  0.046215  0.740778  0.204866  0.047914  0.143158  0.317274
    4  0.311755  0.456133  0.704235  0.255057  0.558791  0.319582
    

    【讨论】:

    • 好的,有没有办法动态指定键名而不是硬编码?
    • @Newskooler 你的意思是键名,你的意思是列表(range(len(dfs)))
    • 我的意思是:keys=['df1','df2']
    • @Newskooler 使用list(range(len([df1, df2])))
    【解决方案2】:

    如果你喜欢不使用 groupby,你可以使用这个。

    list_dfs = [df1, df2]
    df = pd.concat(list_dfs, ignore_index = False)
    
    new_dfs = []
    counter = 0
    for i in list_dfs:
        new_dfs.append(df[counter:counter+len(i)])
        counter += len(i)
    

    【讨论】:

    • 这不适用于除df1.index 之外的任何其他内容。因为df2.index是从df开始的。
    • 那么您在 df1 和 df2 之间没有唯一索引。我假设你有这个!
    • 如果您测试我提供的代码,您会看到生成的数据帧的索引类似于:0, 1, 2, 3, 4, 0, 1, 2, 3, 4。所以现在我需要将其拆分回0, 1, 2, 3, 40, 1, 2, 3, 4
    • 好的,所以即使新的解决方案有效,它仍然是一种非常手动且不可扩展的方法。这意味着如果我有 100 个DataFrames,那将不适用。
    • @Newskooler,它可以适用于大量数据帧,请找到我的更新解决方案
    猜你喜欢
    • 2013-02-28
    • 2018-01-29
    • 1970-01-01
    • 2020-02-27
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多