Python запись в Dataframe внутри функции - PullRequest
0 голосов
/ 20 марта 2020

Я уверен, что это должно быть прямо, но пытаясь решить эту проблему в течение нескольких дней, я думаю, что знаю, что я делаю неправильно, но одержим идеями:

Я использую функция для подмножества Dataframe и на основе подмножества создать новый столбец в этом подмножестве и заполнить его. Это работает, но если я не назначу это обратно новому фрейму данных с именем mod_df, я не смогу вернуть его в df

Похоже, что после завершения функции данные теряются.

Буду признателен за любые мысли

mod_df = []

def Pop_Gen(lower, upper, val):
    x = df[(df['byear'] >= lower) &  (df['byear'] <= upper)].assign(Gen = val)
    mod_df.append(x)

for index, row in gen_Ref_df.iterrows():
    Pop_Gen(row.lower,row.upper,row.val)

Ввод

1-й кадр данных:

df:

   Name  byear  
0  John  1980  
1  Mary  1990 

2-й кадр данных:

gen_Ref_df:

   val   lower   upper  
0  old   1970    1985  
1  new   1986    1995

Токовый выход

mod_df:

   Name  byear Gen  
0  John  1980  old  
1  Mary  1990  new

Ожидаемый выход df без необходимости вставлять в mod_df)

df:

   Name  byear Gen  
0  John  1980  old  
1  Mary  1990  new  

1 Ответ

0 голосов
/ 20 марта 2020

Предполагая, что df и gen_Ref_df имеют одинаковое количество строк, я бы сделал следующее:

# These should be your input DataFrame

d = {'name': ['John', 'Mary'], 'byear': [1980, 1990]}
df = pd.DataFrame(data=d)

d = {'val': ['old', 'new'], 'lower': [1970, 1986], 'upper': [1985, 1995]}
gen_Ref_df = pd.DataFrame(data=d)


# Replace the for loop and the function call with a single line
# Create a new column 'Gen' in df and populate each row with the Gen val obtained by the two conditions 
df['Gen'] = gen_Ref_df[(df['byear'] >= gen_Ref_df.lower) & (df['byear'] <= gen_Ref_df.upper)].assign(Gen = gen_Ref_df.val).Gen

print(df)

Результат :

   name  byear  Gen
0  John   1980  old
1  Mary   1990  new
...