首页 > 解决方案 > DataFrame的行和列之间的迭代以计算平均值

问题描述

我有一个数据框,内容如下:

       A  2007/Ago  2007/Set  2007/Out ... 2020/Jan 2020/Fev
row1   x   number     number    number ...   number   number
row2   y   number     number    number ...   number   number
row3   w   number     number    number ...   number   number
...      
row27  z   number     number    number ...   number   number

我的意思是,每个单元格中都有数字。我想计算列以 2007 开头的单元格的平均值,然后计算列以 2008 开头的单元格的平均值,然后是 2009,...,然后是 2020 并对每一行执行此操作.

我试图描绘的是这样的:

x = []

for i in df.row(i):             #that is, for each row of the dataframe
    if column.startswith('j'):  #which starts with j=2008, 2009, 2010 etc
        x += df[i][j]         #the variable x gets the number on that row i,column j and sum

我到底想要的是各种列,每年的平均值,也就是说,我想要

result1       result2          result3     ...     resultn
mean colums   mean colums    mean columsn        mean columsn
 starts          starts        starts               starts
 with 2008      with 2009      with 2010          with 2020

也就是说,我想要 13 个新列:每个平均值一个(从 2008 年到 2020 年)。

我无法继续这个循环,我不知道这有多基本,但我的问题是:

1-有没有更优化的方法来做到这一点?我的意思是,使用循环以外的熊猫函数?

在我的数据框中,每个单元格对应于该月的总医疗支出成本,我想取全年成本的平均值,将其与每个城市的人口(这是 thw 行)进行比较。我为此苦苦挣扎了一段时间,但无法解决。我使用熊猫的水平非常基础。

PS:对于数据框表示抱歉,我不知道如何在stackoverflow的正文问题中正确写一个。

标签: pandasmean

解决方案


通过melt+的选项pivot_table, aggfunc 设置为:

import pandas as pd

df = pd.DataFrame({
    'A': {'row1': 'x', 'row2': 'y', 'row3': 'w', 'row27': 'z'},
    '2007/Ago': {'row1': 1, 'row2': 2, 'row3': 3, 'row27': 4},
    '2007/Set': {'row1': 5, 'row2': 6, 'row3': 7, 'row27': 8},
    '2007/Out': {'row1': 9, 'row2': 10, 'row3': 11, 'row27': 12},
    '2020/Jan': {'row1': 13, 'row2': 14, 'row3': 15, 'row27': 16},
    '2020/Fev': {'row1': 17, 'row2': 18, 'row3': 19, 'row27': 20}
})

df = df.melt(id_vars='A', var_name='year')
# Rename month columns to their year value
df['year'] = df['year'].str.split('/').str[0]

# pivot to wide format based on the new year value
df = (
    df.pivot_table(columns='year', index='A', aggfunc='mean')
    .droplevel(0, 1)
    .rename_axis(None)
    .rename_axis(None, axis=1)
)
print(df)

df

   2007  2020
w     7    17
x     5    15
y     6    16
z     8    18

推荐阅读