Python 数据帧中每X行满足条件的所有行中的平均数据

Python 数据帧中每X行满足条件的所有行中的平均数据,python,pandas,Python,Pandas,这是我在这里的第一篇帖子,所以如果我做得不对,请告诉我。我对熊猫也很陌生,所以我可以很容易地忽略一些显而易见的东西 我有一个数据集,需要对其执行定期平均。在每个周期内,我还需要对在某一列中具有不同值的子集进行单独的平均 以下是用于说明目的的合成数据帧: import pandas as pd # subjects 1 and 2 pertain to math and science, respectively df = pd.DataFrame([[1, 85, 3], [1, 70, 2],

这是我在这里的第一篇帖子,所以如果我做得不对,请告诉我。我对熊猫也很陌生,所以我可以很容易地忽略一些显而易见的东西

我有一个数据集,需要对其执行定期平均。在每个周期内,我还需要对在某一列中具有不同值的子集进行单独的平均

以下是用于说明目的的合成数据帧:

import pandas as pd
# subjects 1 and 2 pertain to math and science, respectively
df = pd.DataFrame([[1, 85, 3], [1, 70, 2], [2, 77, 4], [2, 96, 3],
                   [1, 91, 2], [1, 83, 4], [1, 97, 6], [1, 92, 2],
                   [1, 76, 1], [2, 80, 2], [2, 90, 4], [2, 99, 5]],
                   columns=['Subject', 'Score', 'StudyHours'])
我希望能够平均每个x行中的所有列数据(在本例中,我将使用x=4),并对每组4行中的每个主题进行平均

第一个要求已经满足,我知道您可以根据列中的条件获取数据子集(例如,df_math=df[df['Subject']==1]),但我无法找到/找到一种方法来组合这些功能。linked post中的rolling和groupby方法都会生成它们自己的对象类型,据我所知,它们不能像dataframe那样基于列条件进行分离

我有一个可行的解决方案,但它不是很优雅,而且它似乎没有充分利用pandas为其数据帧提供的高效功能,因此我希望有一位对pandas更有经验的人能够帮助我改进我的解决方案:

from math import ceil
total_rows = len(df)
period = 4
num_per = ceil(total_rows / period)
num_sub = len(df['Subject'].unique())

# Create list to store DFs of averaged data
avg_vals = [ [] for _ in range(num_per) ]
avg_vals = [ avg_vals.copy() for _ in range(num_sub + 1) ]

i = 0
while i < total_rows:
    # Define current set of x rows
    section = df[i:i+period]
    # Determine current row in averages list
    row = int(i / period)
    # Add DF of means to array of total averages list
    avg_vals[0][row] = pd.DataFrame(section.mean()).transpose()
    for j in range(1, num_sub+1):
        # If there is any data for current subject...
        if any(section['Subject'] == j):
            # Add DF of current subject means to its averages list
            avg_vals[j][row] = pd.DataFrame(section[section['Subject'] == j].mean()).transpose()
    # increment i to move to next set of x rows
    i = i + period

# Remove any empty list elements
for i in range(1, num_sub + 1):
    avg_vals[i] = [ j for j in avg_vals[i] if type(j) != list ]
# Concatenate DFs of averages in each list and set correct indexing
for i in range(num_sub + 1):
    avg_vals[i] = pd.concat(avg_vals[i]).reset_index(drop=True)

如果您可以发布您正在寻找的输出数据帧,我相信您很快就会得到答案。@SomeDude我在示例解决方案末尾包含的数据帧(avg_vals[0]、avg_vals[1]和avg_vals[2])就是我正在寻找的。我使用的方法将这三种方法都包含在avg_vals列表中,但这并不是我的目标所必需的。我这样做只是为了数据管理的目的。我编辑了原始文章,使我要寻找的数据帧更加清晰。
# Total Averages: avg_vals[0] 
    Subject    Score    StudyHours
0   1.50       82.00    3.0
1   1.00       90.75    3.5
2   1.75       86.25    3.0

# Math Averages: avg_vals[1]
    Subject    Score    StudyHours
0   1.0        77.50    2.5
1   1.0        90.75    3.5
2   1.0        76.00    1.0

# Science Averages: avg_vals[2]
    Subject    Score    StudyHours
0   2.0        86.50    3.50
1   2.0        89.67    3.67