【问题标题】:pandas dataframe groupby a number of rows熊猫数据框按行数分组
【发布时间】:2013-02-28 17:38:59
【问题描述】:

如果你有一只熊猫DataFrame({'a':[1,2,3,4,5,6,7,8,9]}),有没有一种简单的方法可以将它分成 3 组或任意数量的组?

我知道这可以通过添加一个包含允许分组的值的额外列来完成,例如,您可以将上述 DataFrame 加入到[1,1,1,2,2,2,3,3,3] 和 groupby 添加的列。但似乎不需要为此操作添加额外的列。

我还可以创建一个索引数组 np.linspace(0,9,4) 并使用它们作为 DataFrame.ix[] 的参数循环数组值,但这对于大型 DataFrames 来说似乎并不快。

我错过了更简单的方法吗?

==解决方案==

从下面的答案中,我首选的解决方案是使用 numpy.array_split (如果与 numpy.split 不同,它不会引发异常),您还可以传递要拆分的索引数组而不是所需的结果件数。使用下面的行,您可以将 DataFrame (df) 拆分为 x 行的较小 DataFrame

split_df = np.array_split(df, np.arange(0, len(df),x))

split_df 是一个列表,其中第一个对象是一个空的 numpy 数组,后面的对象是拆分后的 DataFrame。

【问题讨论】:

    标签: python numpy pandas


    【解决方案1】:

    根据您的示例DataFrame

    In [25]: df.index/3
    Out[25]: Int64Index([0, 0, 0, 1, 1, 1, 2, 2, 2], dtype=int64)
    
    In [26]: for k,g in df.groupby(df.index/3):
        ...:     print k,g
        ...:     
    0    a
    0  1
    1  2
    2  3
    1    a
    3  4
    4  5
    5  6
    2    a
    6  7
    7  8
    8  9
    

    【讨论】:

    • 谢谢,对于示例 DataFrame 和使用带有标准索引的 groupby 来说,这是一个很好的答案。我使用的较大的 DataFrame 往往有一个 DateTimeIndex。
    • @seumas:在这种情况下,您可以调用df.reset_index(),它会为您提供一个带有线性索引的数据框,并且您之前的 DateTimeIndex 会变成一列(除非您使用.reset_index(drop=True))跨度>
    【解决方案2】:

    这是另一种使用numpy.splitnumpy.array_split 的方法:

    df = pd.DataFrame({"A":np.arange(9), "B":np.arange(10, 19)}, 
                      index=np.arange(100, 109))
    for tmp in np.split(df, 3):
        print tmp
    

    输出是:

         A   B
    100  0  10
    101  1  11
    102  2  12
         A   B
    103  3  13
    104  4  14
    105  5  15
         A   B
    106  6  16
    107  7  17
    108  8  18
    

    【讨论】:

    • 谢谢,我之前没有注意到 np.split。
    • 我认为应该注意np.split仅在array对象被N整除时才有效。如果不是,则会引发错误,因此,我认为更好的函数是np.array_split,它与np.split 相同,但当array 不能被@ 整除时不会引发错误987654331@.
    猜你喜欢
    • 2019-10-14
    • 2017-07-08
    • 2021-08-11
    • 2018-07-19
    • 2019-05-15
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    相关资源
    最近更新 更多