Использование одного pandas фрейма данных для заполнения нового столбца в другом pandas фрейме данных - PullRequest
2 голосов
/ 11 марта 2020

У меня есть два кадра данных. Первый кадр данных - df_states, а второй - state_lookup.

df_states

   state         code     score
0  Texas         0        0.753549
1  Pennsylvania  0        0.998119
2  California    1        0.125751
3  Texas         2        0.125751
state_lookup

   state         code_0    code_1   code_2
0  Texas         2014      2015     2019
1  Pennsylvania  2015      2016     207
2  California    2014      2015     2019

Я хочу создать новый столбец в df_states с именем 'year', который основан на столбце 'code', который основан на таблице state_lookup. Так, например, если у Техаса есть код = 0, тогда исходя из state_lookup df, год должен быть 2014. Если у Техаса есть код = 2, то год должен быть 2019.

Это то, что конечный результат должен выглядеть следующим образом:

df_states

   state         code     score      year
0  Texas         0        0.753      2014
1  Pennsylvania  0        0.998      2015
2  California    1        0.125      2015
3  Texas         2        0.124      2019

Я пытался использовать for l oop для перебора каждой строки, но не могу заставить его работать. Как бы вы этого достигли?

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Вы можете сначала использовать wide_to_long на вашем state_lookup df, чтобы вы могли выполнить merge:

s = pd.wide_to_long(state_lookup,stubnames="code",sep="_",i="state",j="year",suffix="\d").reset_index()
s.columns = ["state","code","year"] #rename the columns properly

print (df_states.merge(s, on=["state","code"],how="left"))

          state  code     score  year
0         Texas     0  0.753549  2014
1  Pennsylvania     0  0.998119  2015
2    California     1  0.125751  2015
3         Texas     2  0.125751  2019
1 голос
/ 11 марта 2020

Загрузка фреймов данных

df_states = pd.DataFrame({'state':['Texas','Pennsylvania','California','Texas'],'code':[0,0,1,2], 'score':[0.753549,0.998119,0.125751,0.12575]})
state_lookup = pd.DataFrame({'state':['Texas','Pennsylvania','California'],'code_0': [2014,2015,2014],'code_1': [2015,2016,2017] , 'code_2': [2019,2017,2019]})

Первое использование melt для преобразования ваших code_ столбцов в строки

melted_lookup = pd.melt(state_lookup,
                        id_vars=['state'],
                        value_vars=[col for col in state_lookup.columns if col.startswith('code_')], 
                        var_name='new_code',
                        value_name='year')

Затем объединение двух фреймов данных:

df_states['new_code'] = "code_"+ df_states.code.astype('str') 

df_states = pd.merge(df_states, melted_lookup, how = 'left', on =['new_code','state'])

#   state        code   score      new_code year
#0  Texas           0   0.753549    code_0  2014
#1  Pennsylvania    0   0.998119    code_0  2015
#2  California      1   0.125751    code_1  2017
#3  Texas           2   0.125750    code_2  2019
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...