pandas 根据单个记录的结束日期和开始日期将记录数合并到 Dataframe

uqjltbpv  于 2023-01-01  发布在  其他
关注(0)|答案(2)|浏览(103)

我有这两个初始表:
表格1:
| 客户ID|开始时间|结束时间|面积|
| - ------| - ------| - ------| - ------|
| 1个|2022年12月1日下午4:00:00| 2022年12月1日下午4:05:00|美国广播公司|
| 第二章|2022年12月1日下午4:02:00| 2022年12月1日下午4:03:00|美国广播公司|
表二:
| 面积|开始时间|结束时间|
| - ------| - ------| - ------|
| 美国广播公司|2022年12月1日下午4:01:26| 2022年12月1日下午4:02:00|
| 美国广播公司|2022年12月1日下午4:02:05| 2022年12月1日下午4:02:55|
| 美国广播公司|2022年12月1日下午4:04:10| 2022年12月1日下午4:05:00|
我需要用这个来结束:
表三:
| 客户ID|开始时间|结束时间|面积|记录数量|
| - ------| - ------| - ------| - ------| - ------|
| 1个|2022年12月1日下午4:00:00| 2022年12月1日下午4:05:00|美国广播公司|三个|
| 第二章|2022年12月1日下午4:02:00| 2022年12月1日下午4:03:00|美国广播公司|1个|
将需要一种有效的方法来合并表,因为行的数量是巨大的。
使用表1中的StartTime、EndTime和Area来确定表2中这些条件的记录数。然后添加一列来显示此记录数。
我试过左连接表,但花费的时间太长。

8fsztsew

8fsztsew1#

这可能不是最有效的方法,但却是实现目标的可能方法之一。
我定义了一个函数来计算记录数#ofRecords,并使用了apply(),如下所示:

import pandas as pd

df1 = pd.DataFrame({
    'CustID': [1, 2],
    'StartTime': ['12/1/2022 4:00:00 PM', '12/1/2022 4:02:00 PM'],
    'EndTime': ['12/1/2022 4:05:00 PM', '12/1/2022 4:03:00 PM'],
    'Area': ['ABC', 'ABC'],
})

df2 = pd.DataFrame({
    'Area': ['ABC', 'ABC', 'ABC'],
    'StartTime': ['12/1/2022 4:01:26 PM', '12/1/2022 4:02:05 PM', '12/1/2022 4:04:10 PM'],
    'EndTime': ['12/1/2022 4:02:00 PM', '12/1/2022 4:02:55 PM', '12/1/2022 4:05:00 PM'],
})

print(df1)
print(df2)

"""
   CustID             StartTime               EndTime Area
0       1  12/1/2022 4:00:00 PM  12/1/2022 4:05:00 PM  ABC
1       2  12/1/2022 4:02:00 PM  12/1/2022 4:03:00 PM  ABC

  Area             StartTime               EndTime
0  ABC  12/1/2022 4:01:26 PM  12/1/2022 4:02:00 PM
1  ABC  12/1/2022 4:02:05 PM  12/1/2022 4:02:55 PM
2  ABC  12/1/2022 4:04:10 PM  12/1/2022 4:05:00 PM
"""

# Convert a type of the StartTime and EndTime columns to datetime type
df1['StartTime'] = pd.to_datetime(df1['StartTime'])
df1['EndTime'] = pd.to_datetime(df1['EndTime'])
df2['StartTime'] = pd.to_datetime(df2['StartTime'])
df2['EndTime'] = pd.to_datetime(df2['EndTime'])

def row_counter(st, et):
    # Calculate the number of records
    counter = 0
    for i, row in df2.iterrows():
        if (st <= row['StartTime']) and (et >= row['EndTime']):
            counter += 1
    return counter

df3 = df1.copy()  # create a new dataframe by coping df1
df3['#ofRecords'] = df3.apply(lambda x: row_counter(x['StartTime'], x['EndTime']), axis=1)
print(df3)

"""
   CustID           StartTime             EndTime Area  #ofRecords
0       1 2022-12-01 16:00:00 2022-12-01 16:05:00  ABC           3
1       2 2022-12-01 16:02:00 2022-12-01 16:03:00  ABC           1
"""
x0fgdtte

x0fgdtte2#

假设第一个表加载到df1中,第二个表加载到df2中,并且StartDate和EndDate是datetime类型,您可以执行以下操作:

df1['#ofRecords'] = None
for i, rows in df1.iterrows():
    count = df2[(df2['StartTime']>= rows.StartTime)&(df2['EndTime']<= rows.EndTime)].shape[0]
    df1['#ofRecords'].loc[i] = count

相关问题