我有一个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
最简单的方法是什么?
答案 0 :(得分:0)
我想不出一个很好的方法来做,所以我只遍历了数据框:-
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