我想我会在大熊猫中以一种倒退的方式解决这个问题。这是一个示例数据框:
Group rstart rend qty
1 10000 11000 1000
1 10000 11000 8000
1 10000 11000 13000
1 10000 11000 1000
2 6000 8000 4000
2 6000 8000 9000
2 6000 8000 3000
最后,我试图确定组内数量或数量组合,它们介于范围之间,并在新列中放置一个标志(如果可能的话,也将组合保存在新列中)。
这是我到目前为止所做的以及我遇到问题的地方 - 由于我不熟悉这种语言,所以尝试了各种不同的方式。
import pandas as pd
import numpy as np
import itertools
df = pd.read_csv('test.csv')
d = df[['group','qty']]
s = d.groupby('group')['qty'].apply(list).to_dict()
comb = list(map(dict,itertools.combinations(s.items(),2)))
我试过的梳理和多种变化只是打印字典。将2用于两个变体以测试它但不工作 - 这必须根据列表中的#值进行调整。
我引入了数据集,然后认为最好创建一个包含每个分组和数量列表的字典,以便在单独的表中创建所有组合。一旦我得到每个值的组合和总和 - 链接回主数据帧以与总数和标志进行比较。
我遇到了创建与群组相关的数量和求和的每个组合的问题。如果存储在所有词典的列表中,我可以执行它,但我需要按组分组。例如,组1应该有1000,8000和1000,13000以及1000,1000和1000,8000,13000等等。组合的数量可以因组而异。
任何人都可以协助指导我朝着正确的方向前进吗?也许我的想法是关于如何解决这个问题。
谢谢
答案 0 :(得分:1)
这是一个自解释的解决方案,它也将itertools.combination
与列表推导结合使用:
def aggregate(sub_df):
# get boundaries and actual values
bound_low = sub_df["rstart"].iloc[0]
bound_high = sub_df["rend"].iloc[0]
values = sub_df["qty"].values
# get possible combinations, iterate all lengths of combinations
combis = [itertools.combinations(values, x+1)
for x in range(len(values))]
# flatten all combis and apply filter condition
result = [combi for sub_combi in combis
for combi in sub_combi
if bound_low <= sum(combi) <= bound_high]
return result
print(df.groupby("Group").apply(aggregate))
Group
1 [(1000, 8000, 1000)]
2 [(4000, 3000)]
dtype: object
但是,我不明白你的group 1 should have 1000,8000 and 1000,13000 and 1000,1000 and 1000,8000,13000
。