根据每个组的大小拆分数据帧

时间:2018-11-09 23:54:46

标签: python python-3.x pandas pandas-groupby

如何在Pandas中动态将以下代码转换为简单的一行?就像我总是有三个数字的范围一样,然后查找数据是否介于两者之间?

dataA = data.groupby('ID').apply(lambda x:  (len(x) > 3) & (len(x) < 6))
dataB = data.groupby('ID').apply(lambda x:  (len(x) > 6) & (len(x) < 9))
dataC = data.groupby('ID').apply(lambda x:  (len(x) > 9) & (len(x) < 12))

1 个答案:

答案 0 :(得分:2)

我假设您的目标是根据每个组的大小将数据框分成几组。

您可以避免使用字典来创建额外的变量。您还可以避免使用列表为每个切片手动定义边界。最后,您可以一次执行计算每个组的大小。

L = [3, 6, 9, 12]

sizes = data.groupby('ID')['SOME_COL'].transform('size')  # SOME_COL can be any series

data = {}
for key, (len1, len2) in zip('ABC', zip(L, L[1:])):
    data[key] = data.loc[sizes.between(len1, len2, inclusive=False)]

或者,您可以将以上内容表达为字典理解:

data = {key: data.loc[sizes.between(len1, len2, inclusive=False)] \
        for key, (len1, len2) in zip('ABC', zip(L, L[1:]))}