Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在循环中按索引对列表中的元素求和_Python_List_Pandas_Dataframe_Aggregate - Fatal编程技术网

Python 在循环中按索引对列表中的元素求和

Python 在循环中按索引对列表中的元素求和,python,list,pandas,dataframe,aggregate,Python,List,Pandas,Dataframe,Aggregate,我有一个函数,它返回一个oneliner pd.DataFrame。我已将该函数包装在一个循环中,并希望根据索引聚合结果 def func(input): some calculation return oneliner oneliner看起来像这样 date return return_lev 20100101 0.05 0.0725 我的循环现在生成了几个这样的OneLiner,如果它们的日期相同,我想聚合所有的OneLiner

我有一个函数,它返回一个oneliner pd.DataFrame。我已将该函数包装在一个循环中,并希望根据索引聚合结果

def func(input):
     some calculation
     return oneliner
oneliner
看起来像这样

date         return   return_lev
20100101      0.05      0.0725
我的循环现在生成了几个这样的OneLiner,如果它们的日期相同,我想聚合所有的OneLiner,否则只需附加onliner:

df = []
for x in range(0, 10)
    res = func(x)
    df.append(res).groupby(by = 'date').sum()
然而,这告诉我:

AttributeError: 'NoneType' object has no attribute 'groupby'
即使我取出
groupby
,我也会得到错误:

AttributeError: 'NoneType' object has no attribute 'sum'
你知道我怎么解决这个问题吗

编辑:我们开始吧,我有一个函数,它将随机数生成为一行,类似于我的结果

df_date = pd.DataFrame(['20100101', '20100102', 
                    '20100103', '20100104', '20100105'], columns = ['date'])

from random import randint

def test_func(i):
    a = randint(0, 9) + i
    b = randint(0, 9) / 10 + i
    c = randint(0, 9) + i
    d = randint(0, 9) / 10 + i
    datetime = df_date.sample(1)

    a_s = pd.Series(a, dtype = int)
    b_s = pd.Series(b, dtype = float)
    c_s = pd.Series(c, dtype = int)
    d_s = pd.Series(d, dtype = float)

    overview = pd.DataFrame(np.concatenate([a_s, b_s, c_s, d_s]).reshape(1, 4), 
                            columns = ['a', 'b', 'c', 'd'], index = datetime)

    return overview
现在,在我之前的尝试中:

dfs_test = []

for x in range(5):
    test_results = test_func(x)
    dfs_test.append(test_results).groupby(by = 'datetime').sum()
这给了我如上所述的感觉

AttributeError: 'NoneType' object has no attribute 'groupby'
现在,在另一个版本中,我生成了一个数组/列表:

from random import randint

def test_func_2(i):
    a = randint(0, 9) + i
    b = randint(0, 9) / 10 + i
    c = randint(0, 9) + i
    d = randint(0, 9) / 10 + i
    datetime = df_date.sample(1)

    a_s = pd.Series(a, dtype = int)
    b_s = pd.Series(b, dtype = float)
    c_s = pd.Series(c, dtype = int)
    d_s = pd.Series(d, dtype = float)

    overview = [datetime, a_s, b_s, c_s, d_s]

    return overview
现在是列表版本:

dfs_test_2 = pd.DataFrame([test_func_2(z) for z in range(5)],
                  columns=['datetime', 'a', 'b', 'c', 'd'])

dfs_test_2 = dfs_test_2.groupby('datetime').sum().reset_index()

返回数据帧列表,然后附加它们或通过循环添加结果的想法是低效的

相反,我建议您输出一个列表列表,然后一步构建数据帧

def func(var):
    """Return list of [date, return, return_lev]"""
    # some calculation
    return [a, b, c]

# build dataframe
df = pd.DataFrame([func(x) for x in range(10)],
                  columns=['date', 'return', 'return_lev'])

# perform groupby
df = df.groupby('date').sum().reset_index()

Update:返回标量列表的函数实际上返回了
pd.Series
对象的列表

请尝试以下方法:

def test_func_2(i):
    a = randint(0, 9) + i
    b = randint(0, 9) / 10 + i
    c = randint(0, 9) + i
    d = randint(0, 9) / 10 + i
    datetime = df_date.sample(1).values[0][0]

    overview = [datetime, a, b, c, d]

    return overview

感谢您在之后构建数据框架的tipp。那里的数据帧构建是(1x1)pd系列的串联。我已尝试在您的解决方案中创建类似的列表或数组。但是当运行代码时,我得到了以下错误:
DataError:没有要聚合的数值类型
TypeError:“Series”对象是可变的,因此它们不能散列
,我假设它们来自函数返回的列表。我想这是因为pd.Series?在这种情况下,您需要提供一些数据,以便我们可以复制您的错误。例如,您的问题是一个列表列表(例如10行),然后我们可以看到问题所在。谢谢,事实上,我可以将所有变量设置为标量,就像您对datetime、pd.Series.values所做的那样。将按照您的建议恢复asapit工作!现在,对于使用子集数据帧创建元组列表的函数,循环还有另一个问题。您拥有的不是列表列表列表,而是数据帧列表。您需要修改函数,使其返回一个列表。由于您尚未为
func
共享此代码,我们无法帮助解决此问题。@jpp:您能建议如何最好地共享此代码吗?这是一个很长的代码;我目前正在尝试编写一个产生类似输出的示例函数,这样我们就可以在一个循环中尝试它,请耐心等待,这是一个困难的过程。你将不得不做一些工作来提供一个新的解决方案。这可能需要一些时间,但时间花得很好。@jpp:我创建了两个版本:一个是原始版本(首先是无效的pd.DataFrame,然后是list),另一个版本(尝试更改为list/array,然后是pd.DataFrame)。当我运行这些代码时,我会得到与运行原始代码相同的错误