python - Pandas:使用嵌套 for 循环进行单元比较的替代方法
问题描述
我正在解决一个问题,试图在车站找到火车会议,但我很难找到一种方法来进行必要的比较而不使用嵌套的 for 循环(这很慢,我有数百个数千个数据点)。
我的 DataFrame-rows 包含以下有用数据:到达时间(日期时间)、出发时间(日期时间)、唯一的火车 ID(字符串)、火车在开始和结束时间之间的车站(字符串)和它遇到的火车的火车 ID 的单元格(字符串,开始时为空)。我想找到所有满足的行对,这意味着我想要满足:
- 从第 1 行的到达到离开的时间间隔与第 2 行的到达到离开的时间间隔重叠。
- 位于同一个车站。
此外,没有涉及超过两列火车的会议。
我尝试了以下方法(代码如下):我根据到达和离开时间创建了间隔对象。然后我使用嵌套的 for 循环将每一行的间隔与其他每一行进行比较,如果它们重叠,我检查站是否匹配。如果他们这样做了,我将每个火车 ID 存储在另一个火车会议室中。
df_dsp['interval'] = [func(x,y) for x, y in zip(df_dsp['arrival'], df_dsp['departure'])]
meetings = np.empty([])
for i in range (1,len(df.index)):
for q in range (1,len(df.index)):
if (i < q): # Train meetings are symmetric.
if df.iloc[i, df.columns.get_loc('interval')].overlaps(df.iloc[q, df.columns.get_loc('interval')]):
if df.iloc[i, df.columns.get_loc('station')] == df.iloc[q, df.columns.get_loc('station')]:
df.iloc[i, df.columns.get_loc('train_id_meeting')] = df.iloc[q, df.columns.get_loc('train_id')]
df.iloc[q, df.columns.get_loc('train_id_meeting')] = df.iloc[i, df.columns.get_loc('train_id')]
我看过类似的问题,但很难将它们有效地应用于我的数据集。我的问题是:我怎样才能更快地进行这些比较?
编辑:我不能给出数据库(有点分类),但我做了一个有代表性的数据集。
d = {'arrival': [pd.Timestamp(datetime.datetime(2012, 5, 1, 1)), pd.Timestamp(datetime.datetime(2012, 5, 1, 3)),
pd.Timestamp(datetime.datetime(2012, 5, 1, 6)), pd.Timestamp(datetime.datetime(2012, 5, 1, 4))],
'departure': [pd.Timestamp(datetime.datetime(2012, 5, 1, 3)), pd.Timestamp(datetime.datetime(2012, 5, 1, 5)),
pd.Timestamp(datetime.datetime(2012, 5, 1, 7)), pd.Timestamp(datetime.datetime(2012, 5, 1, 6))],
'station': ["a", "b", "a", "b"],
'train_id': [1, 2, 3, 4],
'meetings': [np.nan, np.nan, np.nan, np.nan]}
df = pd.DataFrame(data=d)
在这个样本数据中,第 2 行和第 4 行将代表在“b”站相遇的火车。如果这可以在不使用间隔对象的情况下更快地完成,我很乐意使用它。
解决方案
我的头要爆炸了。抱歉,由于我没有足够的积分,我无法发表评论。无论如何,我们可以让您的数据库对其进行测试吗?
是否必须在第 1 行与第 2 行(对)或第 1 行与任何行匹配?
你实际上在做 O(n^2),它肯定可以改进,但它必须很好地理解问题是什么。
Pandas 中最有效的算法是试图将所有内容理解为可以与 Numpy 数组(向量化)进行比较和处理的矩阵,但我认为情况并非如此。
“区间”的数据类型是什么?
推荐阅读
- javascript - 潜在的无限循环:超过 10001 次迭代
- ios - 我可以使用 SecItemUpdate 更新 kSecAttrApplicationTag 吗?
- javascript - 如何使用其文档 ID 从 Firestore 获取多个文档?
- javascript - 如何将 Google Analytics 脚本添加到 Uno WebAssembly
- mysql - 无法将数据库迁移到 AWS 弹性 Beanstalk
- python - 通过视图更新相关模型字段(Django REST)
- javascript - 将功能切换到用户添加的 li
- unity3d - 使用 Unity hub 构建后出现黑屏问题
- python - 如何在python的tkinter中显示mapbox
- ruby - 用 ruby 操作 csv