Я работаю с набором данных, который состоит из нескольких различных переменных. Для каждой из этих переменных набор данных также содержит переменную «кодирования». Это своего рода категориальная переменная, которая содержит дополнительную информацию о переменной, на которую она ссылается, при условии, что есть какая-либо дополнительная информация об этой переменной.
Например:
data = { year: [2000, 2001, 2000, 2001],
observation: ['A', 'A', 'B', 'B'],
height: [1, 2, 3, 4],
height_code: ['S', 'BF', 'BF', 'S'] }
df = pd.DataFrame(data)
В этом примере , если переменная кодирования принимает значение «BF» означает босиком. То есть человек не носил ничего на ногах, когда измеряли его рост. Напротив, 'S' обозначает обувь.
Теперь мне нужно определить, у каких людей был измерен их рост при ношении обуви, и либо: (1) - преобразовать их высоту в np.nan, чтобы они не включены в расчет средней высоты по годам позже в процессе. ИЛИ (2) - сгенерировать альтернативный DataFrame, в котором люди, измеренные во время ношения обуви, исключаются из этого нового DF. Затем мне нужно вычислить среднюю высоту по году и добавить ее к еще одному DF.
Чтобы прояснить ситуацию: это обобщенный пример. Мой набор данных содержит несколько различных переменных, и каждая переменная может иметь код, который необходимо учитывать, или его нельзя кодировать (в этом случае мне не нужно интересоваться значением этого наблюдения). Следовательно, реальная проблема заключается в том, что у меня могут быть наблюдения (строки), содержащие, скажем, 4 переменные, и 2 из них закодированы (так что их значения должны игнорироваться в последующих вычислениях), тогда как другие 2 не закодированы (и должны учитываться) , Таким образом, я не могу полностью отказаться от наблюдения, но должен изменить значения в 2 кодированных переменных, чтобы игнорировать их в вычислениях. (Предположим, я должен вычислить среднее значение по годам для каждой из переменных независимо)
ЧТО Я ПОПРОБОВАЛ:
Я написал эти две функциональные версии одного и того же понятия. Вторая функция должна быть передана в DataFrame с помощью .apply (). Тем не менее, это должно быть применено по крайней мере 4 раза (один раз для каждой пары target_variable / code_variable, я называю здесь переменные кодирования test_col) ...
# sub_val / sub_value -
# This function goes through each row in a pandas DataFrame and each time/iteration the
# function will [1] check one of the columns (the "test_col") against a specific value
# (maybe passed in as an argument, maybe default null value). [2] If the check returns
# True, then the function will replace the value of another column (the "target_col")
# in the same row for np.nan . [3] If the check returns False, the fuction will skip to
# the next row.
# - This version is inefficient because it creates one Series object for every
# row in the DataFrame when iterating through it.
def sub_val(df, target_col, test_col, test_val) :
# iterate through DataFrame's rows - returns lab (row index) and row (row values as Series obj)
for lab, row in df.iterrows() :
# if observation contains combined data code, ignore variable value
if row[test_col] == test_val :
df.loc[lab, target_col] = np.nan # Sub current variable value by NaN (NaN won't count in yearly agg value)
return df
# - This version is more efficient.
# Parameters:
# [1] obs - DataFrame's row (observation) as Series object
# [2] col - Two strings representing the target and test columns' names
# [3] test_val - The value to be compared to the value in test_col
def sub_value(obs, target_col, test_col, test_val) :
# Check value in the column being tested.
if obs[test_col] == test_val :
# If condition holds, it means target_col contains a so-called "combined" value
# and should be ignored in the calculation of the variable by year.
obs[target_col] = np.nan # Substitute value in target column for NaN
else :
# If condition does not hold, we can assign NaN value to the column being tested
# (i.e. the combined data code column) in order to make sure its value isn't
# some undiserable value.
obs[test_col] = np.nan
return obs # Returns the modified row