Python:如何遍历行并应用函数创建新列

时间:2018-07-02 15:53:31

标签: python pandas dataframe

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 ,例如m表示在变量列中)。因此,我有以下函数,该函数从以变量中的字符串开头的列中减去 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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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