![](/img/trans.png)
[英]Need to compare one Pandas (Python) dataframe with values from another dataframe
[英]Python Pandas how to compare date from one Dataframe with dates in another Dataframe?
我有 Dataframe 1:
Hotel DateFrom DateTo Room
BBB 2019-10-29 2020-03-27 DHS
BBB 2020-03-28 2020-10-30 DHS
BBB 2020-10-31 2021-03-29 DHS
BBB 2021-03-30 2099-01-01 DHS
和 Dataframe 2:
Hotel DateFrom DateTo Room Food
BBB 2020-03-01 2020-04-24 DHS A
BBB 2020-04-25 2020-05-03 DHS B
BBB 2020-05-04 2020-05-31 DHS C
BBB 2020-06-01 2020-06-22 DHS D
BBB 2020-06-23 2020-08-26 DHS E
BBB 2020-08-27 2020-11-30 DHS F
我需要检查 df1 中的每一行是否以及 df1_DateFrom 是否介于 df2_DateFrom 和 df2_DateTo 之间。 然后我需要将该食品代码从 df2 获取到 df1 中的新列或如下所示的新 df3。
结果将如下所示:
df3:
Hotel DateFrom DateTo Room Food
BBB 2019-10-29 2020-03-27 DHS
BBB 2020-03-28 2020-10-30 DHS A
BBB 2020-10-31 2021-03-29 DHS F
BBB 2021-03-30 2099-01-01 DHS
我真的很感激这方面的任何帮助。 我在 Pandas 上有点新,还在学习,我必须说这对我来说有点复杂。
您可以进行交叉合并和查询:
# recommend dealing with datetime type:
df1['DateFrom'],df1['DateTo'] = pd.to_datetime(df1['DateFrom']),pd.to_datetime(df1['DateTo'])
df2['DateFrom'],df2['DateTo'] = pd.to_datetime(df2['DateFrom']),pd.to_datetime(df2['DateTo'])
new_df = (df1.reset_index().merge(df2, on=['Hotel','Room'],
how='left', suffixes=['','_'])
.query('DateFrom_ <= DateFrom <= DateTo_')
)
df1['Food'] = new_df.set_index('index')['Food']
Output:
Hotel DateFrom DateTo Room Food
0 BBB 2019-10-29 2020-03-27 DHS NaN
1 BBB 2020-03-28 2020-10-30 DHS A
2 BBB 2020-10-31 2021-03-29 DHS F
3 BBB 2021-03-30 2099-01-01 DHS NaN
远不如 Quang Hoang 的回答优雅,但使用np.piecewise
的解决方案看起来像这样。 另请参阅https://stackoverflow.com/a/30630905/4873972
import pandas as pd
import numpy as np
from io import StringIO
# Creating the dataframes.
df1 = pd.read_table(StringIO("""
Hotel DateFrom DateTo Room
BBB 2019-10-29 2020-03-27 DHS
BBB 2020-03-28 2020-10-30 DHS
BBB 2020-10-31 2021-03-29 DHS
BBB 2021-03-30 2099-01-01 DHS
"""), sep=r"\s+").convert_dtypes()
df1["DateFrom"] = pd.to_datetime(df1["DateFrom"])
df1["DateTo"] = pd.to_datetime(df1["DateTo"])
df2 = pd.read_table(StringIO("""
Hotel DateFrom DateTo Room Food
BBB 2020-03-01 2020-04-24 DHS A
BBB 2020-04-25 2020-05-03 DHS B
BBB 2020-05-04 2020-05-31 DHS C
BBB 2020-06-01 2020-06-22 DHS D
BBB 2020-06-23 2020-08-26 DHS E
BBB 2020-08-27 2020-11-30 DHS F
"""), sep=r"\s+").convert_dtypes()
df2["DateFrom"] = pd.to_datetime(df2["DateFrom"])
df2["DateTo"] = pd.to_datetime(df2["DateTo"])
# Avoid zero index for merging later on.
df2["id"] = np.arange(1, len(df2) +1 )
# Find matching indexes.
df1["df2_id"] = np.piecewise(
np.zeros(len(df1)),
[(df1["DateFrom"].values >= start_date) & (df1["DateFrom"].values <= end_date) for start_date, end_date in zip(df2["DateFrom"].values, df2["DateTo"].values)],
df2.index.values
)
# Merge on matching indexes.
df1.merge(df2["Food"], left_on="df2_id", right_index=True, how="left")
Output:
Hotel DateFrom DateTo Room Food
0 BBB 2019-10-29 2020-03-27 DHS NaN
1 BBB 2020-03-28 2020-10-30 DHS A
2 BBB 2020-10-31 2021-03-29 DHS F
3 BBB 2021-03-30 2099-01-01 DHS NaN
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.