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