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]
答案 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