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

时间:2018-04-17 16:02:22

标签: 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,否则只需附加在线人员:

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()

1 个答案:

答案 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