Pandas矢量化了一种生成一组行与所有其他行的成对组合的方法

2024-06-01 14:41:11 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有一种pandas矢量化的方法来生成所有成对行组合的特定子集,如下所示:给定一组可分辨的行,我想将组中的每一行与所有其他行(即,组外行和组内行)配对。因此,如果整个集合的长度为n,而组的长度为k, k << n,那么我正在寻找一个向量化的O(nk)

例如,假设我们得到以下数据帧

   CarMaker Model  HorsePower  TopSpeed
0      Audi    S3         100       200
1      Audi    S5         110       210
2       BMW    M3         120       220
3       BMW    M4         130       230
4  Mercedes   GLS         140       240
5  Mercedes   AMG         150       250

从一段易于复制的代码

input_df = pd.DataFrame({
    "CarMaker": ["Audi", "Audi", "BMW", "BMW", "Mercedes", "Mercedes" ],
    "Model": ["S3", "S5", "M3", "M4", "GLS", "AMG"],
    "HorsePower": [100, 110, 120, 130, 140, 150],
    "TopSpeed": [200, 210, 220, 230, 240, 250]
})

杰出的团队是奥迪汽车,我想将所有奥迪车型与所有其他行配对,以获得

  CarMaker_main Model_main CarMaker_other Model_other  HP_main  HP_other  TopSpeed_main  TopSpeed_other

0          Audi         S3           Audi          S5      100       110            200             210
1          Audi         S3            BMW          M3      100       120            200             220
2          Audi         S3            BMW          M4      100       130            200             230
3          Audi         S3       Mercedes         GLS      100       140            200             240
4          Audi         S3       Mercedes         AMG      100       150            200             250
5          Audi         S5            BMW          M3      110       120            210             220
6          Audi         S5            BMW          M4      110       130            210             230
7          Audi         S5       Mercedes         GLS      110       140            210             240
8          Audi         S5       Mercedes         AMG      110       150            210             250

Tags: models3mainmercedesm3otherm4audi
1条回答
网友
1楼 · 发布于 2024-06-01 14:41:11

如果您不介意将模型与自身进行比较,那么可以使用merge

import pandas as pd

input_df = pd.DataFrame({
    "CarMaker": ["Audi", "Audi", "BMW", "BMW", "Mercedes", "Mercedes" ],
    "Model": ["S3", "S5", "M3", "M4", "GLS", "AMG"],
    "HorsePower": [100, 110, 120, 130, 140, 150],
    "TopSpeed": [200, 210, 220, 230, 240, 250]
})

df_main = input_df[input_df["CarMaker"]=="Audi"].copy()
df_other = input_df.copy()

df_main["key"] = 0
df_other["key"] = 0

pd.merge(df_main, df_other, how="outer", on="key", suffixes=("_main", "_other")).drop("key", axis=1).sort_index(axis=1)

如果您有熊猫>;1.2您可以跳过“关键”把戏,只需将how=“cross”传递给合并

pd.merge(df_main, df_other, how="cross", suffixes=("_main", "_other")).sort_index(axis=1)

相关问题 更多 >