我有一个返回oneliner pd.DataFrame的函数。我已将该函数包装在循环中,并希望根据索引聚合结果。
def func(input):
some calculation
return oneliner
oneliner
看起来像这样
date return return_lev
20100101 0.05 0.0725
我的循环现在产生了几个oneliner,如果他们有相同的日期我想汇总所有oneliner,否则只需附加在线人员:
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'
任何想法,我怎么能解决这个问题?
编辑:我们去了,我有一个函数可以生成随机数作为oneliner,类似于我的结果。
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()
答案 0 :(得分:3)
您想要返回数据帧列表然后追加它们或通过循环添加结果是没有效率的。
相反,我建议您输出列表列表,然后一步构建数据框。
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()
更新:您返回标量列表的函数实际上会返回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