Pandas Groupby и рассчитанная сумма - PullRequest
0 голосов
/ 27 октября 2018

В настоящее время я перевожу некоторые скрипты 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

1 Ответ

0 голосов
/ 27 октября 2018

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

Сначала создайте функцию, которая использует 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)

out:

            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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...