【问题标题】:Pandas split DataFrame by Column Function with GroupingPandas 按列函数拆分 DataFrame 并进行分组
【发布时间】:2020-06-22 15:39:19
【问题描述】:

我有一个DataFrame,下面的列:

         A      B     C    D
ID                          
276      4    7.0    30    0
76       2    3.0    15    0
203      7    9.5    15   11
197      7    9.5    11    0
261      8    8.5     9   11
119      2    8.0    15   12
547      7    2.5    10    0
385     13   10.0    30    0
202      6    9.5    11    0
286      4    9.0    30    0
459      4    9.5     7    0
36       2    3.0    15    0
442      5    9.0     7    0
554      6    8.0     6    0
309      2    7.5    30    0
334      5    7.0    15    0
238      2    8.5    18    0
6        2    6.0    30    0
237      2    7.5    24    0
509      3    7.0    30    0
319      3    6.0    18    0
179      6    9.0    18    0
328      4    8.0    18    0

我正在尝试将 DataFrame 按列 'A' 拆分为多个值,其中值的总和小于或等于 w,并且对拆分或 ID 的数量没有定义的限制

(即df['A'].sum() <= w

如果可能,首先按'B' 列的最大值分组。

生成的DataFrames 应如下所示:

    A   B   C   D
ID
385 13  10  30  0
203 7   9.5 15  11
    A   B   C   D
ID
197 7   9.5 11  0
202 6   9.5 11  0
459 4   9.5 7   0
    A   B   C   D
ID
286 4   9   30  0
442 5   9   7   0
179 6   9   18  0
    A   B   C   D
ID
261 8   8.5 9   11
238 2   8.5 18  0
119 2   8   15  12
554 6   8   6   0
    A   B   C   D
ID
328 4   8   18  0
309 2   7.5 30  0
237 2   7.5 24  0
276 4   7   30  0
334 5   7   15  0
509 3   7   30  0
    A   B   C   D
ID
6   2   6   30  0
319 3   6   18  0
76  2   3   15  0
36  2   3   15  0
547 7   2.5 10  0

最简单的方法是什么?

【问题讨论】:

  • this question 可能重复。
  • 所以为了澄清你想创建多个新的数据帧,其中 A 的总和小于 w 并且 B 的总和在每个新帧中大致相等?
  • 我正在尝试对“A”之和小于“w”的数据帧进行分块,并通过最小化“B”列中的差异来对这些块进行分组。

标签: python pandas dataframe split


【解决方案1】:

我想不出一个好的 pandas 方法,所以我刚刚迭代了数据框:-

import pandas as pd
from io import StringIO
w = 20
data = StringIO('''
ID       A      B     C    D                   
276      4    7.0    30    0
76       2    3.0    15    0
203      7    9.5    15   11
197      7    9.5    11    0
261      8    8.5     9   11
119      2    8.0    15   12
547      7    2.5    10    0
385     13   10.0    30    0
202      6    9.5    11    0
286      4    9.0    30    0
459      4    9.5     7    0
36       2    3.0    15    0
442      5    9.0     7    0
554      6    8.0     6    0
309      2    7.5    30    0
334      5    7.0    15    0
238      2    8.5    18    0
6        2    6.0    30    0
237      2    7.5    24    0
509      3    7.0    30    0
319      3    6.0    18    0
179      6    9.0    18    0
328      4    8.0    18    0
''')
df = pd.read_csv(data, delimiter=r"\s+")
df.set_index('ID', inplace=True)
df.sort_values(by=['B'], ascending=[False], inplace=True)

dfs = []
new_df = df.iloc[0:0,:].copy()
total = 0

for n, (index, row) in enumerate(df.iterrows()):
    total += row['A']
    if total > w or n+1 >= len(df):
        dfs.append(new_df)
        new_df = df.iloc[0:0, :].copy()
        total = row['A']


    new_df = new_df.append(row)


for group in dfs:
    print(group, end='\n\n')

输出:-

        A     B     C     D
ID                         
385  13.0  10.0  30.0   0.0
203   7.0   9.5  15.0  11.0

       A    B     C    D
ID                      
197  7.0  9.5  11.0  0.0
202  6.0  9.5  11.0  0.0
459  4.0  9.5   7.0  0.0

       A    B     C    D
ID                      
179  6.0  9.0  18.0  0.0
286  4.0  9.0  30.0  0.0
442  5.0  9.0   7.0  0.0
238  2.0  8.5  18.0  0.0

       A    B     C     D
ID                       
261  8.0  8.5   9.0  11.0
328  4.0  8.0  18.0   0.0
119  2.0  8.0  15.0  12.0
554  6.0  8.0   6.0   0.0

       A    B     C    D
ID                      
309  2.0  7.5  30.0  0.0
237  2.0  7.5  24.0  0.0
509  3.0  7.0  30.0  0.0
276  4.0  7.0  30.0  0.0
334  5.0  7.0  15.0  0.0
6    2.0  6.0  30.0  0.0

       A    B     C    D
ID                      
319  3.0  6.0  18.0  0.0
76   2.0  3.0  15.0  0.0
36   2.0  3.0  15.0  0.0

【讨论】:

    猜你喜欢
    • 2016-02-17
    • 1970-01-01
    • 2017-08-26
    • 2014-05-15
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    相关资源
    最近更新 更多