Pandas groupby и рассчитанная сумма

в настоящее время я перевожу некоторые сценарии R на Python. Но я борюсь со следующей строкой:

  return(trackTable[, .(
    AVERAGE_WIND_COMPONENT = sum(TRACK_WIND_COMPONENT*GROUND_DIST, na.rm = T)/sum(GROUND_DIST, na.rm = T) #PRÜFEN!!!!!
  ), by=KEY_COLUMN])

Теперь я попытался переписать код R на python:

table['temp'] = (table['track_wind_component'] * table['ground_dist']) / table['ground_dist']
AVERAGE_WIND_COMPONENT = table.groupby(['KEY_COLUMN'])['temp'].sum()
AVERAGE_WIND_COMPONENT = pd.DataFrame({'KEY_COLUMN':AVERAGE_WIND_COMPONENT.index, 'AVERAGE_WIND_COMPONENT':AVERAGE_WIND_COMPONENT.values})

Но мои результаты для AVERAGE_WIND_COMPONENT неверны ... Что я здесь неправильно перевел? Вероятно, это группа по мере того, как я строю свой временный столбец.

Пример df:

    KEY_COLUMN  track_wind_component    ground_dist
0   xyz -0.000000   2.262407
1   xyz 0.000000    9.769840
2   xyz -135.378229 38.581616
3   xyz 11.971863   30.996997
4   xyz -78.208083  45.404430
5   xyz -88.718762  48.589553
6   xyz -118.302506 22.193426
7   xyz -71.033648  76.602917
8   xyz -68.369886  11.092901
9   xyz -65.706124  6.210328
10  xyz -60.822561  17.444752
11  xyz 39.630277   18.082869
12  xyz 102.477706  35.175366
13  xyz 43.061773   8.793499
14  xyz -71.036785  15.289568
15  xyz 65.246215   49.247986
16  xyz -29.249612  1.043781
17  xyz -25.848495  11.490416
18  xyz -11.223688  NaN

ожидаемый результат для этого KEY_COLUMN: -36.8273304

Похоже, вам нужно среднее значение, так почему бы не использовать mean вместо sum после агрегирования?

Learning is a mess 27.10.2018 20:41

Код R правильный. мне это нужно, так как он переведен на python @Learningisamess

Bernouy 27.10.2018 20:43

@Bernouy мы можем увидеть образец df и ожидаемый результат?

It_is_Chris 27.10.2018 20:49

@ Крис, я отредактировал

Bernouy 27.10.2018 20:57

@Bernouy, какие вычисления вы делаете, чтобы получить -12.5461..., я не знаком с r

It_is_Chris 27.10.2018 21:10

Это то, о чем я спрашиваю ... я тоже не знаком с r .... данный код R вычисляет результат -12.5461644 для данного примера DF.

Bernouy 27.10.2018 21:11

@Chris, извините, я опубликовал неправильный пример DF и неправильный результат. Теперь это должно быть правильно.

Bernouy 27.10.2018 21:39

В коде Python / table['ground_dist'] выглядит странно. В коде R он делится на сумму

Andrew Lavers 27.10.2018 22:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
8
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, теперь ваш ожидаемый результат имеет смысл

Сначала создайте функцию, которая использует np.sum (), это эквивалент суммы R (значение, na.rm = T)

def my_agg(df):
    names = {
        'result': np.sum(df['track_wind_component'] * df['ground_dist']) / np.sum(df['ground_dist'])
    }

    return pd.Series(names, index=['result'])

df.groupby('KEY_COLUMN').apply(my_agg)

из:

            result
KEY_COLUMN  
xyz        -36.827331

Что не так с вашим кодом:

table['temp'] = (table['track_wind_component'] * table['ground_dist']) / table['ground_dist']

# this is just creating a column that is the exact same as
# table['track_wind_component'] because, for example, (x*y)/y = x

AVERAGE_WIND_COMPONENT = table.groupby(['KEY_COLUMN'])['temp'].sum()

# you are now essentially just grouping and summing the track_wind_column

код R берет сумму (table['track_wind_component'] * table['ground_dist']), деленную на сумму (table['ground_dist'])

все, что сгруппировано по key_column

Код R также игнорирует значения NaN, поэтому я использовал np.sum().

Что-то не так, когда я запускаю ваш код ... в результате я получаю 2.373595 ... для каждого KEY_COLUMN один и тот же результат

Bernouy 27.10.2018 22:14

@Bernouy позволь мне дважды проверить

It_is_Chris 27.10.2018 22:15

@Bernouy Я не могу воспроизвести эту проблему.

It_is_Chris 27.10.2018 22:21

Другие вопросы по теме