如何在Python(pandas、Jupyter)中根据另一列的值获取某一列数值的平均值。

3

这张图片显示了我正在使用的测试数据集,以验证是否正确计算了平均值。

我希望能够根据“T”列中的筛选值获取“G”列中相应值的平均值。

因此,我根据想要对“G”列中的值求和的“T”列设置了值,然后将总和除以计数以获得平均值,并将其附加到一个变量中。 然而,平均值计算不正确。请参见下方截图

total=0
g_avg=[]
output=[]
counter=0
for i, row in df_new.iterrows():
    if (row['T'] > 2):
        counter+=1
        total+=row['G']
    if (counter != 0 and row['T']==10):
        g_avg.append(total/counter)
        counter = 0
        total = 0
        
print(g_avg)

以下是更好的数据集,因为'T'值中存在重复,所以我需要一个计数器来获取在特定范围内(例如从凌晨2点到上午10点等)的'T'值时的G值平均值。 抱歉,它不允许我直接粘贴数据集,所以我截取了一部分。

1
欢迎来到StackOverflow。请提供一个最小可重现示例,包括数据。列“T”似乎没有任何值为10的值,因此您甚至没有进入第二个“if”。您也可以只使用df_new[df_new['T'] > 2]['G'].mean() - sim
@sim,它不允许我粘贴数据集,但我已经上传了代码。 - zahid
@sim,程序的要点是数据集包含1周的数据,我们想在“T”列例如在下午2点至7点之间时取“g”列的平均值,并将其附加到列表中。 - zahid
1个回答

2

如果你想要在T在2和7之间时,计算列G的平均值:

df_new.loc[(df_new['T']>2) & (df_new['T']<7), 'G'].mean()

更新

如果您没有任何期望输出,很难知道您想要什么。如果您有以下数据:

print(df)                                                              
    T  G
0   0  0
1   0  0
2   1  0
3   2  1
4   3  3
5   4  0
6   5  4
7   6  5
8   7  0
9   8  6
10  9  7

你想要像这样的东西:

print(df)                                                              
    T  G
0   0  0
1   0  0
2   1  0
3   2  1
4   3  3
5   4  3
6   5  3
7   6  3
8   7  0
9   8  6
10  9  7

然后你可以使用布尔索引DataFrame.loc

avg = df.loc[(df['T']>2) & (df['T']<7), 'G'].mean()
df.loc[(df['T']>2) & (df['T']<7), 'G'] = avg

print(df)                                                                               
    T    G
0   0  0.0
1   0  0.0
2   1  0.0
3   2  1.0
4   3  3.0
5   4  3.0
6   5  3.0
7   6  3.0
8   7  0.0
9   8  6.0
10  9  7.0

更新2

如果您有一些样本数据:

print(df)                                                                               
    T  G
0   0  1
1   2  2
2   3  3
3   3  1
4   3  2
5  10  4
6   2  5
7   2  5
8   2  5
9  10  5

方法 1:要简单地获取这些手段的列表,您可以为您的间隔创建组,并在 m 上进行过滤:

m = df['T'].between(0,5,inclusive=False)
g = m.ne(m.shift()).cumsum()[m]
lst = df.groupby(g).mean()['G'].tolist()

print(lst)                                                                              
[2.0, 5.0]

方法二:如果您想在各自的T值处包含这些手段,那么可以尝试以下方法:

m = df['T'].between(0,5,inclusive=False)
g = m.ne(m.shift()).cumsum()
df['G_new'] = df.groupby(g)['G'].transform('mean')

print(df)                                                                               
    T  G  G_new
0   0  1      1
1   2  2      2
2   3  3      2
3   3  1      2
4   3  2      2
5  10  4      4
6   2  5      5
7   2  5      5
8   2  5      5
9  10  5      5

是的,但我不想要一个平均值,我想在每次t值在那个范围内时将平均值附加到列表中。例如,t是时间(2-7am),因此这将在一周期间一遍又一遍地重复,因此我希望每次这种情况发生时将平均值附加到列表中。 - zahid
我已更新响应。请告诉我这是否回答了你的问题。 - dkhara
是的,这是正确的,但它只解决了问题的一部分(可能是由于我的模糊解释)。'T'值将具有重复值,例如t=[0,2,3,3,3,10,2,2,2,10]和g=[1,2,3,1,2,4,5,5,5,5]。在这种情况下,假设我想要在每个实例中取' T '大于0且<5时' G '值的平均值,我将希望将平均值附加到列表中。因此,在这种情况下,列表将看起来像g_avg=[2,5]。这就是我卡住的地方。非常感谢您的帮助。 - zahid
我已经更新了答案以满足这个例子。这是你要找的吗? - dkhara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接