Вы смешиваете индекс обоих данных.С этим синтаксисом, который вы предлагаете, сравнение выполняется строка за строкой .Вы можете просто увидеть это, если мы увидим следующие фреймы данных (с другим размером):
df1 = pd.DataFrame(
[[1, "2019-01-21"],
[2, "2019-02-01"],
[3, "2019-04-05"],
[4, "2019-04-05"],
[5, "2019-04-05"],
[6, "2019-04-05"],
[7, "2019-05-01"],
[8, "2019-05-12"]],
columns=["unique_id", "timestamp"])
df2 = pd.DataFrame([
["A", "2019-01-05", "2019-02-02"],
["D", "2019-04-06", "2019-05-03"],
["C", "2019-03-01", "2019-04-05"],
["B", "2019-02-03", "2019-02-28"],
["E", "2019-05-04", "2019-05-31"],],
columns=["classification", "from", "to"])
# Comparaison of different dataframes
print((df1['timestamp'] > df2['from']))
Произошла ошибка:
ValueError: Может сравнивать только идентично помеченные объекты Series
Здесь , вы хотите сравнить согласно соответствующий интервал даты и времени .Таким образом, вы должны различать оба кадра данных.Чтобы преобразовать строковые данные в дату, pandas.to_datetime
выполните работу (doc)
Вот один из способов сделать это:
# import modules
import pandas as pd
df1 = pd.DataFrame(
[[1, "2019-01-21"],
[2, "2019-02-01"],
[3, "2019-04-05"],
[4, "2019-04-05"],
[5, "2019-04-05"],
[6, "2019-04-05"],
[7, "2019-05-01"],
[8, "2019-05-12"]],
columns=["unique_id", "timestamp"])
df2 = pd.DataFrame([
["A", "2019-01-05", "2019-02-02"],
["D", "2019-04-06", "2019-05-03"],
["C", "2019-03-01", "2019-04-05"],
["B", "2019-02-03", "2019-02-28"],
["E", "2019-05-04", "2019-05-31"],],
columns=["classification", "from", "to"])
# convert to datetime
df1["timestamp"] = pd.to_datetime(df1["timestamp"], format="%Y-%m-%d")
df2[["from", "to"]] = df2[["from", "to"]].apply(pd.to_datetime, format="%Y-%m-%d")
# Try to compare 2 different dataframes
# print((df1['timestamp'] > df2['from']))
class_column = []
for index, row in df1.iterrows():
class_fd2 = df2[(df2["from"] <= row["timestamp"]) & (df2["to"] >= row["timestamp"])]["classification"].values[0]
class_column.append(class_fd2)
df1["class1"] = class_column
print(df1)
# unique_id timestamp class1
# 0 1 2019-01-21 A
# 1 2 2019-02-01 A
# 2 3 2019-04-05 C
# 3 4 2019-04-05 C
# 4 5 2019-04-05 C
# 5 6 2019-04-05 C
# 6 7 2019-05-01 D
# 7 8 2019-05-12 E
Вы также можете сделать это вфункция, применяемая к df1
:
def set_class(row):
return df2[(df2["from"] <= row["timestamp"]) & (
df2["to"] >= row["timestamp"])]["classification"].values[0]
# Process
df1["class2"] = df1.apply(set_class, axis=1)
print(df1)
# unique_id timestamp class1 class2
# 0 1 2019-01-21 A A
# 1 2 2019-02-01 A A
# 2 3 2019-04-05 C C
# 3 4 2019-04-05 C C
# 4 5 2019-04-05 C C
# 5 6 2019-04-05 C C
# 6 7 2019-05-01 D D
# 7 8 2019-05-12 E E