簡體   English   中英

有沒有辦法合並間隔索引和 pandas 中的另一個列值?

[英]Is there a way to merge on Interval Index and another Column Value in pandas?

所以我目前有2個數據框。 這些有不同的列,我一直試圖弄清楚的是如何合並一個間隔索引以及一個唯一的 ID 值。 以下是我擁有的數據框的 2 個不同示例:

UniqueID,Start_Date,End_Date
ID1,01-01-2020,01-08-2020
ID2,01-02-2020,01-04-2020
ID3,01-03-2020,01-05-2020
ID4,01-04-2020,01-09-2020
ID5,01-05-2020,01-10-2020
ID6,01-06-2020,01-11-2020

創建 dataframe:

pd.DataFrame({
    'UniqueId': ['ID1','ID2','ID3','ID4','ID5','ID6'],
    'Start_Date': ['01-01-2020','01-02-2020','01-03-2020','01-04-2020','01-05-2020','01-06-2020'],
    'End_Date': ['01-08-2020','01-04-2020','01-05-2020','01-09-2020','01-10-2020','01-11-2020']
})

UniqueID,Trip_Date,Value
ID1,10-02-2020,1
ID1,15-02-2020,207
ID2,06-03-2020,10
ID3,29-01-2022,15
ID9,15-02-2020,207
ID12,19-06-2021,189

創建 dataframe:

pd.DataFrame({
    'UniqueId': ['ID1','ID1','ID2','ID3','ID9','ID12'],
    'Trip_Date': ['10-02-2020','15-02-2020','06-03-2020','29-01-2022','15-02-2020','19-06-2021'],
    'Value': ['1','207','10','15','207','189']
})

我想要做的是能夠合並 UniqueID 以及包含開始日期和結束日期的間隔。 生成的 dataframe 如下所示:

UniqueID,Start_Date,End_Date,Trip_Date,Value
ID1,01-01-2020,01-08-2020,10-02-2020,1
ID1,01-01-2020,01-08-2020,15-02-2020,207
ID2,01-02-2020,01-04-2020,06-03-2020,10
ID3,01-03-2020,01-05-2020,NA,NA
ID4,01-04-2020,01-09-2020,NA,NA
ID5,01-05-2020,01-10-2020,NA,NA
ID6,01-06-2020,01-11-2020,NA,NA

df2.merge(df1, how='left', on='UniqueID')

我想到的第一種方法是在 df1 上使用 IntervalIndex,然后基於它進行合並,但是我遇到了無法在 UniqueID 上合並的問題,反之亦然,將 UniqueID 作為合並列。 當我將 df2 與 df1 合並時,我保留了左連接,以保留原始 dataframe,同時將 df1 的任何記錄與 df2 上的潛在“匹配”合並。

我想過可能使用帶有 IntervalIndex 的 MultiIndex 作為級別之一,然后使用 UniqueID 作為另一個級別,但不確定如何 go 解決這個問題? 任何想法將不勝感激!

下面的代碼應該允許您將數據幀放入 pandas df。 只需確保復制並重新分配即可。

df = pd.read_clipboard(sep=',')
df1 = df.copy()

您可以合並兩列上的數據框。 因此,如果您計算每個 dataframe 中的間隔,則可以匹配“UniqueID”和“Interval”。 例如,參見這篇文章: pandas: merge (join) two data frames on multiple columns

將您的 dataframe 合並到您的UniqueID列上,然后檢查Trip_Date是否介於Start_DateEnd_date之間。 最后,將不滿足條件的所有行設置為nan

# Only if this columns have not datetime64 dtype
df1['Start_Date'] = pd.to_datetime(df1['Start_Date'], dayfirst=True)
df1['End_Date'] = pd.to_datetime(df1['End_Date'], dayfirst=True)
df2['Trip_Date'] = pd.to_datetime(df2['Trip_Date'], dayfirst=True)

out = pd.merge(df1, df2, on='UniqueID', how='left')
m = out['Trip_Date'].between(out['Start_Date'], out['End_Date'])

out.loc[~m, ['Trip_Date', 'Value']] = np.NaN

Output:

>>> out
  UniqueID Start_Date   End_Date  Trip_Date  Value
0      ID1 2020-01-01 2020-08-01 2020-02-10    1.0
1      ID1 2020-01-01 2020-08-01 2020-02-15  207.0
2      ID2 2020-02-01 2020-04-01 2020-03-06   10.0
3      ID3 2020-03-01 2020-05-01        NaT    NaN
4      ID4 2020-04-01 2020-09-01        NaT    NaN
5      ID5 2020-05-01 2020-10-01        NaT    NaN
6      ID6 2020-06-01 2020-11-01        NaT    NaN
import pandas as pd

df1 = pd.read_csv("df1.csv")
df2 = pd.read_csv("df2.csv")
new_df = pd.merge(df1, df2,  how='left',)
print(new_df)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM