我有一个由该代码段生成的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
才能获得连续范围。
有更好的方法吗?必须有一个:/
答案 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