【发布时间】:2018-06-10 03:25:18
【问题描述】:
我的目标是获取一个 DataFrame 对象并向其附加多个列,其中这些列是按组计算的,但这些计算不能直观地向量化(它们涉及 if 语句的累积和)。
我来自 R data.table 背景,我将在其中运行如下代码:
DT[,c('newcol1','newcol2'):=f(.SD),by=groupvar]
其中 groupvar 是分组变量,函数 f 接受 sub-data.table(按组拆分)并返回一个列表,其中两个数组的长度等于组的长度。在这种情况下,赋值的副作用 := 将两个新列 newcol1 和 newcol2 附加到原始 data.table DT。
我尝试使用 pandas 文档,但我仍然不清楚如何复制此操作(例如,我的函数 f 应该返回 DataFrames 还是只是带有 Series 的 dict?)。
这是我最初的 df:
import pandas as pd
df=pd.DataFrame({'id': [1, 1, 1, 1, 2, 2, 2, 2],'time':[1,2,3,4,1,2,3,4],'choice':['a','a','b','a','b','b','b','b']})
我想在“a”和“b”两列上添加,以便它们在该时间段的选择之前按该 ID 计算选择“a”或“b”的累积数量。我想要的输出是这样的:
dffinal=pd.DataFrame({'id': [1, 1, 1, 1, 2, 2, 2, 2],'time' [1,2,3,4,1,2,3,4],'choice':['a','a','b','a','b','b','b','b'],'a':[0,1,2,2,0,0,0,0],'b'=[0,0,0,1,0,1,2,3]})
我写了一个函数,大致按组进行正确的操作(假设它已经按时间排序):
def cumulativechoice(df):
length=df.shape[0]
cols=['a','b']
for x in cols:
df[x]=0
for x in cols:
counter=0
for y in range(length):
df.loc[y,x]=counter
if df.loc[y,'choice']==x:
counter=counter+1
return df[cols]
如果我运行累积选择(subdf),其中 subdf 是一个 id 的子数据帧,该函数工作得很好,如果我尝试 df.groupby('id').apply(cumulativechoice) 并显示错误消息“无法重新索引”,它会中断从一个重复的轴'。我在这里做错了什么?
编辑: 更一般地说,我的问题不是关于我的函数累积选择的细节,而是关于我想要的“正确”拆分-应用-组合公式是什么 1) 按组拆分,2) 应用生成多个 dicts/ 的函数一个 DataFrame 等和 3) 组合回来,因此最终结果是我在输出中添加了多个列,在特殊情况下它不像“转换”那么简单。
【问题讨论】:
标签: python pandas pandas-groupby