【发布时间】:2014-04-06 15:59:48
【问题描述】:
我有以下数据帧
mn = pd.DataFrame({'fld1': [2.23, 4.45, 7.87, 9.02, 8.85, 3.32, 5.55],'fld2': [125000, 350000,700000, 800000, 200000, 600000, 500000],'lType': ['typ1','typ2','typ3','typ1','typ3','typ1','typ2'], 'counter': [100,200,300,400,500,600,700]})
映射函数
def getTag(rangeAttribute):
sliceDef = {'tag1': [1, 4], 'tag2': [4, 6], 'tag3': [6, 9],
'tag4': [9, 99]}
for sl in sliceDef.keys():
bounds = sliceDef[sl]
if ((float(rangeAttribute) >= float(bounds[0]))
and (float(rangeAttribute) <= float(bounds[1]))):
return sl
def getTag1(rangeAttribute):
sliceDef = {'100-150': [100000, 150000],
'150-650': [150000, 650000],
'650-5M': [650000, 5000000]}
for sl in sliceDef.keys():
bounds = sliceDef[sl]
if ((float(rangeAttribute) >= float(bounds[0]))
and (float(rangeAttribute) <= float(bounds[1]))):
return sl
我想根据 fld1 和 fld2 的标签计算总和。
目前,我必须为不同类型的字段编写具有硬编码值的不同函数。 MAP 函数只需要 1 个参数。除了MAP还有其他功能吗
也可以将 sliceDef 作为输入参数。
mn.groupby([mn['fld1'].map(getTag),mn['fld2'].map(getTag1),'lType'] ).sum()
【问题讨论】:
-
我不认为 map 对系列中的每个元素进行操作,如果您想逐行传递具有多个参数的操作,那么您可以使用
apply并设置 @987654325 @ like somn.apply(lambda row: getTag(row), axis=1)ingetTag您可以选择如下列:row['fld1']和row['fld2']。这应该可以实现您想要的 -
您可能也有兴趣查看
pd.cut,例如pd.cut(mn.fld1, [1, 4, 6, 9, 99], right=False)。它与您正在寻找的形式不完全相同,但根据我的经验,它非常方便。