【问题标题】:how to map two dataframes on condition while having different rows如何在具有不同行的条件下映射两个数据帧
【发布时间】:2021-03-26 18:28:06
【问题描述】:

我有两个数据框需要根据某些条件进行映射(或加入?)。这些是数据框:

df_1

      img_names   img_array
0         1_rel         253
1   1_rel_right         255
2     1_rel_top         250
3         4_rel         180
4   4_rel_right         182
5     4_rel_top         189
6         7_rel         217
7   7_rel_right         183
8     7_rel_top         196

df_2

  List_No    time
0       1      38
1       4      23
2       7      32

映射后我想得到以下数据框:

df_3

      img_names   img_array    List_No    time   
0         1_rel         253          1      38
1   1_rel_right         255          1      38
2     1_rel_top         250          1      38
3         4_rel         180          4      23
4   4_rel_right         182          4      23
5     4_rel_top         189          4      23
6         7_rel         217          7      32
7   7_rel_right         183          7      32
8     7_rel_top         196          7      32

基本上,df_2 的每一行被填充 3 次以匹配 df_1 中的行数,并且映射(如果我们可以这么说的话)是通过 df_1 的每一行中的拆分字符串完成的s img_name 列。 img_names 中的行元素的名称可能有不同的名称,但它们中的每一个总是以某个数字(在这种情况下为 1,4,7)和取消划线等开头。所以我需要在每一行中拆分对应的数字并将其与List_No 的行元素映射。

我希望上面的例子很清楚。

谢谢。

【问题讨论】:

    标签: python-3.x pandas dataframe mapping


    【解决方案1】:

    看起来你可以只提取数字部分并合并:

    df_1['List_No'] = df_1['img_names'].str.split('_').str[0].astype(int)
    df_3 = df_1.merge(df_2, on='List_No')
    

    输出:

         img_names  img_array  List_No  time
    0        1_rel        253        1    38
    1  1_rel_right        255        1    38
    2    1_rel_top        250        1    38
    3        4_rel        180        4    23
    4  4_rel_right        182        4    23
    5    4_rel_top        189        4    23
    6        7_rel        217        7    32
    7  7_rel_right        183        7    32
    8    7_rel_top        196        7    32
    

    【讨论】:

      【解决方案2】:

      @QuangHoang 的答案的替代方案(我相信你应该选择它,因为它更健壮)。这使用map 方法,并假设df2 的时间中的每个值都在df1 中:

      df1.assign(
          List_No=df1.img_names.str.extract(r"(\d)", expand=False).astype(int),
          time=lambda x: x.List_No.map(df2["time"]),
      )
      
      
         img_names    img_array   List_No time
      0   1_rel            253    1       38
      1   1_rel_right      255    1       38
      2   1_rel_top        250    1       38
      3   4_rel            180    4       23
      4   4_rel_right      182    4       23
      5   4_rel_top        189    4       23
      6   7_rel            217    7       32
      7   7_rel_right      183    7       32
      8   7_rel_top        196    7       32
      

      【讨论】:

        猜你喜欢
        • 2021-11-26
        • 2018-08-07
        • 2021-10-23
        • 1970-01-01
        • 2021-03-14
        • 2019-03-17
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        相关资源
        最近更新 更多