Я отвечаю на вопрос: как получить значение переменной, учитывая ее имя в строке? который закрыт как дубликат со ссылкой на этот вопрос.
Если рассматриваемые переменные являются частью объекта (например, части класса), то некоторые полезные функции для достижения именно этого являются hasattr, getattr и setattr.
Так, например, вы можете иметь:
class Variables(object):
def __init__(self):
self.foo = "initial_variable"
def create_new_var(self,name,value):
setattr(self,name,value)
def get_var(self,name):
if hasattr(self,name):
return getattr(self,name)
else:
raise("Class does not have a variable named: "+name)
Тогда вы можете сделать:
v = Variables()
v.get_var("foo")
"initial_variable" v.create_new_var(v.foo,"is actually not initial")
v.initial_variable
"initial_variable"
Если вы делаете samples
DataFrame со столбцами user
и item
, вы можете получить желаемые значения с помощью внутреннего соединения . По умолчанию pd.merge
объединяется во все столбцы samples
и df
совместно используемые - в этом случае это будут user
и item
. Следовательно,
result = pd.merge(samples, df, how='inner')
дает
user item f1 f2 f3
0 1 5 9 4 4
1 3 7 17 6 5
2 3 7 17 6 5
3 2 6 16 5 5
import numpy as np
import pandas as pd
d = {'user' : [1., 2., 3., 4] ,'item' : [5., 6., 7., 8.],'f1' : [9., 16., 17., 18.], 'f2':[4,5,6,5], 'f3':[4,5,5,8]}
df = pd.DataFrame(d)
samples = np.array([[1,5],[3,7],[3,7],[2,6]])
samples = pd.DataFrame(samples, columns=['user', 'item'])
result = pd.merge(samples, df, how='inner')
result = result[['f1', 'f2', 'f3']]
result = result.values
print(result)
дает
[[ 9. 4. 4.]
[ 17. 6. 5.]
[ 17. 6. 5.]
[ 16. 5. 5.]]
Один подход, который представляет собой бит numpy
array наклонный -
import numpy as np
# Convert item and user columns to a 2-column array
item_user_arr = np.asarray(df[["item","user"]]).astype(int)
# Mask of matches across rows of samples and item_user_arr, with columns flipped
mask = (samples[:,None,1]==item_user_arr[:,0]) & (samples[:,None,0]==item_user_arr[:,1])
# Get indices of matches
_,C = np.where(mask)
# Use those indices to select data from f1,f2,f3 columns for final output array
out = np.asarray(df[["f1","f2","f3"]])[C,:]
Выход для данных входов -
In [536]: out
Out[536]:
array([[ 9., 4., 4.],
[ 17., 6., 5.],
[ 17., 6., 5.],
[ 16., 5., 5.]])