Python, как использовать groupby для классификации данных и расчета среднего значения других столбцов - PullRequest
0 голосов
/ 24 января 2019

У меня есть один кадр данных, как показано ниже. Я хочу использовать столбец 'part1' в качестве эталона для классификации данных на 3 части (каждая часть имеет один и тот же номер набора данных) и рассчитать среднее значение для части part2 каждой группы. Например, row0 и row1 в качестве группы B, а среднее значение составляет (0,67 + (- 0,03)) / 2.

import pandas as pd
df = pd.DataFrame({
    "date":["20130101","20130101","20130103","20130103","20130105","20130105"],
    "part1":[0.5,0.7,1.3,1.5,0.1,0.3],
    "part2":[0.67,-0.03,1.95,-3.25,-0.3,0.6]
})
    date    part1   part2   output
0   20130101    0.5 0.67    0.32
1   20130101    0.7 -0.03   0.32
2   20130103    1.3 1.95    -0.65
3   20130103    1.5 -3.25   -0.65
4   20130105    0.1 -0.3    0.15
5   20130105    0.3 0.6 0.15

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Если вы хотите рассчитать среднее значение за день, вы можете использовать groupby следующим образом:

import pandas as pd
df = pd.DataFrame({
    "date":["20130101","20130101","20130103","20130103","20130105","20130105"],
    "part1":[0.5,0.7,1.3,1.5,0.1,0.3],
    "part2":[0.67,-0.03,1.95,-3.25,-0.3,0.6]
})
df.groupby("date").mean().reset_index()

результат:

       date  part1  part2
0  20130101    0.6   0.32
1  20130103    1.4  -0.65
2  20130105    0.2   0.15
0 голосов
/ 06 августа 2019

Вы можете передать функцию для аргумента by метода groupby панды.

from functools import partial
import pandas as pd

df = pd.DataFrame({
    "date":["20130101","20130101","20130103","20130103","20130105","20130105"],
    "part1":[0.5,0.7,1.3,1.5,0.1,0.3],
    "part2":[0.67,-0.03,1.95,-3.25,-0.3,0.6]
})


def grouper(df, val):
    foo = df.iloc[val]['part1']
    if foo > 0.0 and foo < 0.4:
         return 0
    elif foo > 0.3 and foo < 1.0:
         return 1
    elif foo > 1.0:
         return 2

grouped = df['part2'].groupby(by=partial(grouper, df)).mean()

В результате

1    0.15
2    0.32
3   -0.65
Name: part2, dtype: float64
0 голосов
/ 24 января 2019

Вы можете сделать это с помощью pandas, если у вас есть данные в df:

def foo(x,n=3):
    df = x.copy()
    bins = np.quantile(df['part1'],np.linspace(0,1,n+1))
    df['tmp'] = 0
    for i in range(n):
        idx = (df['part1'] > bins[i]) & (df['part1'] <= bins[i+1])
        df['tmp'][idx] = i
    return df.groupby('tmp').agg({'part2':'mean'})

foo(df)

отделится от квантилей, поэтому гарантирует , что в каждой группе будет одинаковое количество элементов . Группировка по tmp получит эти группы и вычислит среднее значение part2 для каждой группы:

     part2
tmp       
0     0.15
1     0.32
2    -0.65
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...