熊猫根据不同的列值对同一列进行多次分组

时间:2018-11-12 22:40:21

标签: python pandas pandas-groupby

我有一个由该代码段生成的pandas DataFrame:

elig = pd.DataFrame({'memberid': [1,1,1,1,1,1,2],
                     'monthid': [201711, 201712, 201801, 201805, 201806, 201807, 201810]})

并且我想基于.groupby的连续值在memberid上执行monthid操作,例如,我希望最终结果是一个像这个:

memberid | start_month | end_month

    1    |    201711   |  201801
    1    |    201805   |  201807
    2    |    201810   |  201810

我想知道是否有一种惯用的熊猫方法来做到这一点。到目前为止,我已经尝试了一种复杂的方法,先定义一个new_elig = defaultdict(list),然后再定义一个外部函数:

def f(x):
    global new_elig
    new_elig[x.iloc[0]['memberid']].append(x.iloc[0]['monthid'])

最后

elig.groupby('memberid')[['memberid', 'monthid']].apply(f)

要在原始DataFrame中创建约70万行,大约需要5分钟才能创建new_elig,然后我必须手动检查每个memberid才能获得连续范围。

有更好的方法吗?必须有一个:/

1 个答案:

答案 0 :(得分:0)

这里是我希望能够足够快地满足您的需求的一种方法。它涉及一些年月的手动算术运算。感觉很脏,但我认为,这比将private Optional<JSONObject> testFile (Optional<String> jsonFileContent) { try{ return jsonFileContent.map(fileContent -> a(fileContent)); } catch(Exceptione) { return null; } Optional a(Optional<String> jsonFileContent) { try{ return new JSONObject(jsonFileContent); // this lambda expression needs to be extended } catch (Exception e) { return Optional.empty(); } } 列转换为monthid的{​​{1}}系列等更快。

Datetime