Python:如何迭代行并应用函数创建新列

3
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

这是一个迷你版的数据框,我想对每一行进行计算。对于每一行,我想从以变量值开头的列中减去最佳值(例如,对于第一行,我想从m_value中减去best,因为在variable列中指定了m)。因此,我有以下函数,它从以variable字符串开头的列中减去best

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个回答

3

如果可以进行向量化计算,则无需使用逐行的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

2
你可以这样做:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接