Python: как перебирать строки и применять функцию для создания новых столбцов - PullRequest
0 голосов
/ 02 июля 2018
variable    best m_value  g_value  e_value
       m    8      3       3       7
       g    5      5       5       9
       e    7      6       4       4
       m    3      7       8       2
       m    6      2       1       1
       e    7      6       4       2

Это крошечная мини-версия моего фактического фрейма данных, и я хотел бы сделать расчеты для каждой строки. Для каждой строки я хотел бы вычесть лучший из столбца, который начинается со значения переменной (например, для первой строки я хотел бы вычесть best из m_value , так как m указано в столбце переменная ). Поэтому у меня есть следующая функция, которая вычитает best из столбца, который начинается со строки в variable :

df_test['dif'] = df_test.apply(lambda row: (df_test.loc[row,'best']) - (df_test[df_test.columns[pd.Series(df_test.columns).str.startswith(df_test.loc[row,'variable'])]]), axis=0)

Однако я получаю следующую ошибку:

(u'None of [0    m\n1    g\n2    e\n3    m\n4    m\n5    e\n6    g\n7    e\nName: variable, dtype: object] are in the [index]', u'occurred at index variable')

Как правильно применить функцию?

пример данных:

df_test = pd.DataFrame()
df_test['variable']= ['m', 'g', 'e', 'm', 'm', 'e','g', 'e']
df_test['best'] = [8,5,7,3,6,7,8,9]
df_test['m_value']= [3,5,6,7,2,6,6,9]
df_test['g_value']= [3,5,4,8,1,4,7,2]
df_test['e_value']= [7,9,4,2,1,2,3,4]

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Вам не нужно прибегать к построчному pd.DataFrame.apply, где вычисления могут быть векторизованы. Вместо этого вы можете использовать оптимизированные методы, доступные в Pandas. В этом случае через pd.DataFrame.lookup:

df_test['dif'] = df_test['best'] - \
                 df_test.lookup(df_test.index, df_test.variable+'_value')

print(df_test)

  variable  best  m_value  g_value  e_value  lookup
0        m     8        3        3        7       5
1        g     5        5        5        9       0
2        e     7        6        4        4       3
3        m     3        7        8        2      -4
4        m     6        2        1        1       4
5        e     7        6        4        2       5
6        g     8        6        7        3       1
7        e     9        9        2        4       5
0 голосов
/ 02 июля 2018

Вы можете сделать это:

df_test['dif'] = df_test.apply(lambda x: x['best'] - x[x['variable']+'_value'], axis=1)

>>> df
  variable  best  m_value  g_value  e_value  dif
0        m     8        3        3        7    5
1        g     5        5        5        9    0
2        e     7        6        4        4    3
3        m     3        7        8        2   -4
4        m     6        2        1        1    4
5        e     7        6        4        2    5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...