【问题标题】:split dataframe values into a specified number of groups and apply function - pandas将数据帧值拆分为指定数量的组并应用函数 - 熊猫
【发布时间】:2017-05-30 10:24:02
【问题描述】:
df=pd.DataFrame([1,4,1,3,2,8,3,6,3,7,3,1,2,9])

我想将df 拆分为指定数量的组,并对每个组中的所有元素求和。比如把df分成4组

1,4,1,3  2,8,3,6  3,7,3,1  2,9 

会导致

9
19
14
11

我可以使用df.groupby(np.arange(len(df))//4).sum(),但这不适用于更大的数据帧

例如

df1=pd.DataFrame([1,4,1,3,2,8,3,6,3,7,3,1,2,9,1,5,3,4])
df1.groupby(np.arange(len(df1))//4).sum()

创建 5 个组而不是 4 个

【问题讨论】:

  • df.groupby(np.arange(len(df))//4).sum() 的较大 df 有什么问题?什么是问题?对我来说效果很好。
  • @jezrael:第二个 df 的问题在于它创建了 5 个组 [9 19 14 17 7] 而不是 4 个
  • 测试是print (pd.DataFrame([1,4,1,3,2,8,3,6,3,7,3,1,2,9,1,5,3,4]).groupby(np.arange(len(df))//4)[0].apply(list)),我认为它工作正常。
  • @jezrael:谢谢,它适用于第二个数据帧,但它不能推广到其他数据帧,如 pd.DataFrame([1,4,1,3,3,3,1,3 ,1,3,1,4,2,1,3,1,3,12,8,3,6,3,7,3,1,2,4])。问题是我事先不知道 df 将有多少元素,所以我正在寻找一种方法将每个 df 分组到相同数量的组中,而不管它有多少元素
  • 我想我明白了 - 每个 DataFrame 中仍然需要 4 组?

标签: python pandas dataframe split


【解决方案1】:

你可以使用numpy.array_split:

df=pd.DataFrame([1,4,1,3,2,8,3,6,3,7,3,1,2,9,1,5,3,4])

a = pd.Series([x.values.sum() for x in np.array_split(df, 4)])
print (a)
0    11
1    27
2    15
3    13
dtype: int64

concat 和 sum 的解决方案:

a = pd.concat(np.array_split(df, 4), keys=np.arange(4)).sum(level=0)
print (a)
    0
0  11
1  27
2  15
3  13

【讨论】:

  • 输出不正确。也试试df=pd.DataFrame([1,4,1,3,2,8,3,6,3,7,3,1,2,9]) 你会得到[9, 19, 13, 12] 这是不正确的。
  • 期望的输出是什么?
  • for df=pd.DataFrame([1,4,1,3,2,8,3,6,3,7,3,1,2,9]) 不是每组中 4 个元素的总和返回 [9, 19, 13, 12] 吗?我得到了你的代码:[11, 27, 15, 13].
  • Hmmmm,问题是如果需要前 3 组 4 元素和 4. group 与所有其他元素(您的解决方案)或拆分为 4 groups 具有不同数量的组元素,特别是如果更大df.
  • @jezrael:再次感谢您的帮助。这正是我想要的。
【解决方案2】:

假设你有这个数据框:

df = pd.DataFrame([1,4,1,3,2,8,3,6,3,7,3,1,2,9])

您可以使用列表理解和loc:

group_size = 4
[df.loc[i:i+group_size-1].values.sum() for i in range(0, len(df), group_size)]

输出:

[9, 19, 14, 11]

【讨论】:

    【解决方案3】:

    我查看了 cmets,我认为当“常规”pandas 函数无法满足您的需求时,您可以使用一些明确的 python 代码。

    所以:

    import pandas as pd
    
    def get_sum(a, chunks):
        for k in range(0, len(df), chunks):
            yield a[k:k+chunks].values.sum()
    
    df = pd.DataFrame([1,4,1,3,2,8,3,6,3,7,3,1,2,9])
    
    group_size = list(get_sum(df, 4))
    print(group_size)
    

    输出:

    [9, 19, 14, 11]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 2021-05-10
      • 1970-01-01
      • 2018-04-26
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多