gpt4 book ai didi

python - Pandas Groupby Agg 函数不减少

转载 作者:IT老高 更新时间:2023-10-28 20:37:33 27 4
gpt4 key购买 nike

我正在使用我在工作中使用了很长时间的聚合函数。这个想法是,如果传递给函数的系列长度为 1(即该组只有一个观察值),则返回该观察值。如果传递的 Series 的长度大于 1,则观察结果以列表形式返回。

这对某些人来说可能看起来很奇怪,但这不是 X、Y 问题,我有充分的理由想要做与这个问题无关的事情。

这是我一直在使用的功能:

def MakeList(x):
""" This function is used to aggregate data that needs to be kept distinc within multi day
observations for later use and transformation. It makes a list of the data and if the list is of length 1
then there is only one line/day observation in that group so the single element of the list is returned.
If the list is longer than one then there are multiple line/day observations and the list itself is
returned."""
L = x.tolist()
if len(L) > 1:
return L
else:
return L[0]

现在由于某种原因,使用我正在处理的当前数据集,我得到一个 ValueError ,指出该函数没有减少。这是一些测试数据和我正在使用的剩余步骤:

import pandas as pd
DF = pd.DataFrame({'date': ['2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02',
'2013-04-02'],
'line_code': ['401101',
'401101',
'401102',
'401103',
'401104',
'401105',
'401105',
'401106',
'401106',
'401107'],
's.m.v.': [ 7.760,
25.564,
25.564,
9.550,
4.870,
7.760,
25.564,
5.282,
25.564,
5.282]})
DFGrouped = DF.groupby(['date', 'line_code'], as_index = False)
DF_Agg = DFGrouped.agg({'s.m.v.' : MakeList})

在尝试调试时,我将打印语句置于 print Lprint x.index 和输出如下:

[7.7599999999999998, 25.564]
Int64Index([0, 1], dtype='int64')
[7.7599999999999998, 25.564]
Int64Index([0, 1], dtype='int64')

由于某种原因,似乎 agg 将 Series 两次传递给函数。据我所知,这根本不正常,估计是我的功能没有减少的原因。

例如,如果我写一个这样的函数:

def test_func(x):
print x.index
return x.iloc[0]

这运行没有问题,打印语句是:

DF_Agg = DFGrouped.agg({'s.m.v.' : test_func})

Int64Index([0, 1], dtype='int64')
Int64Index([2], dtype='int64')
Int64Index([3], dtype='int64')
Int64Index([4], dtype='int64')
Int64Index([5, 6], dtype='int64')
Int64Index([7, 8], dtype='int64')
Int64Index([9], dtype='int64')

这表明每个组只作为一个系列传递给函数一次。

谁能帮我理解为什么会失败?我已经在我使用的许多数据集中成功地使用了这个函数......

谢谢

最佳答案

我无法真正解释为什么,但根据我的经验 pandas.DataFrame 中的 list 并不能很好地工作。

我通常使用 tuple 代替。这将起作用:

def MakeList(x):
T = tuple(x)
if len(T) > 1:
return T
else:
return T[0]

DF_Agg = DFGrouped.agg({'s.m.v.' : MakeList})

date line_code s.m.v.
0 2013-04-02 401101 (7.76, 25.564)
1 2013-04-02 401102 25.564
2 2013-04-02 401103 9.55
3 2013-04-02 401104 4.87
4 2013-04-02 401105 (7.76, 25.564)
5 2013-04-02 401106 (5.282, 25.564)
6 2013-04-02 401107 5.282

关于python - Pandas Groupby Agg 函数不减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27439023/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com