【问题标题】:Pandas vectorized way to produce pair-wise combinations of a group rows with all other rowsPandas 向量化方式产生一组行与所有其他行的成对组合
【发布时间】:2021-07-20 01:35:52
【问题描述】:

是否有一种pandas 向量化方式来生成所有成对行组合的某个子集,如下所示:给定一组可区分的行,我想将该组中的每一行与所有其他行配对(即两者都有 ex -group 和组内行)。因此,如果整个集合的长度为 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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

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

    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)
    

    如果您有 pandas > 1.2,则可以跳过“关键”恶作剧,只需将 how="cross" 传递给 pandas 合并

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

    【讨论】:

      猜你喜欢
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      相关资源
      最近更新 更多