Панды - установить значения строк на основе значений в другой таблице

1

У меня есть две таблицы в пандах. Один из них составляет около 10, 000+ строк, которые выглядят следующим образом:

Таблица 1

col_1      date      state  ratio [50 more cols]
   A       10/12      NY     .5
   A       12/05      MA     NaN
   .........

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

Таблица 2

date     state    ratio
12/05    MA       .9
12/03    MA       .8
............

Мне нужно установить соотношение в таблице 1 на основе значений даты и состояния из таблицы 2. Идеальным решением было бы слияние по дате и состоянию, но это создает два столбца: ratio_x и ratio_y

Мне нужен способ установить отношение в таблице 1 к соответствующему соотношению в таблице 2, где совпадают дата и состояния. Соотношения в таблице 1 могут быть перезаписаны.

Если это можно сделать правильно, слияние, то это тоже работает.

Изменить: вы можете рассматривать таблицу 2 как предназначенную для отображения определенных значений состояния (так что все состояния в таблице 2 являются MA в этом примере)

  • 1
    «создает две колонки» - и что? Оставьте один из столбцов и переименуйте другой.
  • 0
    Это может быть не самым элегантным или коротким способом, но вы можете создать столбец, объединяющий дату и состояние, а затем установить для столбца отношения в таблице 1 соотношение в таблице 2, используя этот столбец даты-состояния в качестве индекса. Как сказал DYZ, вы всегда можете опустить дополнительный столбец, если он вам не нужен.
Показать ещё 1 комментарий
Теги:
pandas
dataframe

2 ответа

0

Сначала создайте ряд сопоставлений из df2:

s = df2.set_index(['date', 'state'])['ratio']

Затем подайте на df1:

df1['ratio'] = df1.set_index(['date', 'state']).index.map(s.get)\
                  .fillna(df1['ratio'])

Приоритет отдается отношениям в df2.

  • 0
    Разве .get не нужно значение? Как я получаю "TypeError: 'значение' должно быть скаляр, передано: Series"
0

Вам нужно будет выбрать, какое значение ratio принять первым. Предполагая, что коэффициенты из таблицы 2 имеют преимущество:

# join in ratio from the other table
table1 = table1.join(table2.set_index(["date", "state"])["ratio"].to_frame("ratio2"), on=["date", "state"])

# take ratio2 first, then the existing ratio value if ratio2 is null
table1["ratio"] = table1["ratio2"].fillna(table1["ratio"])

# delete the ratio2 column
del table1["ratio2"]
  • 0
    Я получаю сообщение об ошибке при слиянии столбцов object и datetime64 [ns]. Это не произошло с обычным слиянием, и я предполагаю, что это потому, что дата была установлена на индекс
  • 0
    Какую ошибку вы получаете?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню