Скажем, у меня есть эти два набора данных:
Data frame 1:
X | date
a | 1/1/2018
a | 1/2/2018
...
b | 1/1/2018
И дф 2:
Holiday
1/1/2018
5/1/2018
Что было бы элегантным способом добавить новый столбец в первый набор данных с 1, когда дата совпадает со вторым набором данных?
Большое спасибо!
Это достигается с помощью метода isin()
.
df1 = pd.DataFrame({'date': ['1/1/2018', '1/2/2018', '1/1/2018']})
df2 = pd.DataFrame({'Holiday': ['1/1/2018', '5/1/2018']})
df1
# date
# 0 1/1/2018
# 1 1/2/2018
# 2 1/1/2018
df2
# Holiday
# 0 1/1/2018
# 1 5/1/2018
df1['is_holiday'] = df1.date.isin(df2.Holiday).astype(int)
df1
# date is_holiday
# 0 1/1/2018 1
# 1 1/2/2018 0
# 2 1/1/2018 1
Для вашего ответа достаточно метода isin
@Mike, но только для вашего удобства вы можете расширить свой фрейм данных дополнительной информацией о совпадениях, используя merge
с индикатором:
df1.merge(df2, left_on='date', right_on='Holiday', how='left', indicator=True)
X date Holiday _merge
0 a 1/1/2018 1/1/2018 both
1 a 1/2/2018 NaN left_only
2 b 1/1/2018 1/1/2018 both
Здесь мы видим наш столбец _merge
, который указывает, были ли совпадения в обоих или только в левом.
Слова «слияние» и «объединение» используются относительно взаимозаменяемо в Pandas и других языках, а именно в SQL и R. В Pandas есть отдельные функции «слияния» и «объединения», обе из которых выполняют аналогичные действия.
result = pd.merge(df1, df2, on = 'id_column')
result.head()
В вашем конкретном случае это, вероятно, не совсем необходимо, поскольку вы действительно хотите условно добавить столбец в существующий фрейм данных. Как предложил @Mike, вы должны использовать isin()
. Единственная разница здесь в том, что я решил использовать тип данных bool
вместо int
.
df1['is_holiday'] = df1.date.isin(df2.Holiday).astype(bool)
создайте столбец на df2, который имеет только 1, и объедините df1 и df2 по дате и празднику. Левое соединение от df1 к df2 также предоставит даты, которых нет в df2. Я не уверен, что это элегантно, но практично :)