繁体   English   中英

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

[英]Python: How to iterate over rows and apply function to create new columns

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中减去最佳 ,因为m在变量列中指示)。 因此,我有以下函数,它从以变量中的字符串开头的列中减去最佳

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]

您无需求助于行式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

你可以这样做:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM