Python 在循环中按索引对列表中的元素求和
我有一个函数,它返回一个oneliner pd.DataFrame。我已将该函数包装在一个循环中,并希望根据索引聚合结果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
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)。当我运行这些代码时,我会得到与运行原始代码相同的错误