【问题标题】:How to split a dataframe into some dataframes according to list of row numbers?如何根据行号列表将数据框拆分为一些数据框?
【发布时间】:2021-03-12 13:09:54
【问题描述】:

给定一个数据框,我想获得一个不同数据框的列表,它们一起连接到原始数据框。

分隔是通过这样的行索引

import pandas as pd
import numpy as np

data = {"a": np.arange(10)}
df = pd.DataFrame(data)

print(df)
   a
0  0
1  1
2  2
3  3
4  4
5  5
6  6
7  7
8  8
9  9
separate_by = [1, 5, 6, ]

应该给出一个列表

df1 =

   a
0  0

df2 =

   a
1  1
2  2
3  3
4  4

df3 =

   a
5  5

df4 =

   a
6  6
7  7
8  8
9  9

如何在 pandas 中做到这一点?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    让我们试试

    d = dict(tuple(df.groupby(df.index.isin(separate_by).cumsum())))
    
    d[0]
    Out[364]: 
       a
    0  0
    d[2]
    Out[365]: 
       a
    5  5
    

    【讨论】:

      【解决方案2】:
      separate_by = [1, 5, 6, ]
      separate_by.append(len(df))
      separate_by.append(0, 0)
      dfs = [df.loc[separate_by[i]: separate_by[i+1]] for i in range(len(separate_by)-1)]
      

      【讨论】:

      • 我完全支持矢量化,但对于我的用例(很少行),我会考虑可读性。谢谢
      • @Gulzar 事实上,我提出的解决方案在处理大型数据集时远不是最快的。不过,其他解决方案肯定会适合其他人。
      【解决方案3】:

      试试:

      groups = (pd.Series(1, index=separate_by)
                  .reindex(df.index,fill_value=0)
                  .cumsum()
               )
      
      out = {k:v for k,v in df.groupby(groups)}
      

      那么例如out[2]:

         a
      5  5
      

      类似的逻辑:

      groups = np.zeros(len(df))
      groups[separate_by] = 1
      groups = np.cumsum(groups)
      
      out = {k:v for k,v in df.groupby(groups)}
      

      【讨论】:

      • 你能解释一下逻辑吗?我没有关注:(
      • @Gulzar 你能在我的回答中打印groups吗?基本上我试图通过在separate_by 标记1 来构建行组,否则0,然后做一个cumsum。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      相关资源
      最近更新 更多