как получить среднее значение для одного столбца на основе значения другого столбца в python (pandas, jupyter) - PullRequest
2 голосов
/ 27 января 2020

на рисунке показан набор тестовых данных, который я использую для проверки правильности вычисления средних значений.

Я хочу получить среднее значение соответствующих значений в ' Столбец G 'основан на отфильтрованных значениях в столбце' T '.

Таким образом, я устанавливаю значения для столбца' T 'на основе которого я хочу суммировать значения в столбце' G ', а затем делить общее количество, чтобы получить среднее значение, которое добавляется к переменной. однако среднее значение рассчитывается неправильно. см. ниже снимок экрана

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' есть повторение, поэтому мне понадобится счетчик, чтобы получить среднее значение для G значения, когда значение T находится в определенном диапазоне, то есть от 2:00 до 10:00 и т. д. c извините, это не позволит мне просто вставить набор данных, поэтому я взял его немного

1 Ответ

0 голосов
/ 28 января 2020

Если вы хотите получить среднее значение столбца G , когда T находится между 2 и 7:

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]

Метод 2: Если вы хотите включить эти средства в их соответствующие значения 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...