【问题标题】:Mapping index values from one dataframe to another in pandas在 pandas 中将索引值从一个数据帧映射到另一个数据帧
【发布时间】:2017-04-20 01:52:36
【问题描述】:

我有一个数据框df_in,如下所示:

import pandas as pd
import numpy as np
dic_in = {'A':['A1','A1','A1','L3','A3','A3','B1','B1','B1','B2','A2'],
       'B':['xxx','ttt','qqq','nnn','lll','nnn','eee','xxx','qqq','bbb','sss'],
       'C':['fas','efe','pfo','scs','grj','rpo','cbb','asf','asc','wq3','mls']}
df_in = pd.DataFrame(dic_in)

我还有一个名为 df_map 的数据框:

dic_map = {'X':['A1' ,'A1' ,'A1' ,'A2' ,'A3' ,'B1' ,'B1' ,'B1' ,'B1' ,'B2' ,'B3' ,'B3' ,'L1', 'L3' ,'L3'],
           'Y':['qqq','ttt','xxx','sss','lll','eee','qqq','xxx','zzz','bbb','mmm','ooo','kkk','nnn','ttt']}
df_map = pd.DataFrame(dic_map)

我的目标是研究df_in 中的每一个row[['A','B']];如果在df_map 中识别出这两个项目,那么我提取相应索引的值并将其设置为第一个数据帧中的另一列。

例如:A1 - xxx 这对情侣在0 的地图中找到;因此我会在这对夫妇A1 - xxx 旁边放置一个0。 如果没有找到一对夫妇,那么我将放置NaN。

结果应该是这样的:

    Idx   A    B    C
0     2  A1  xxx  fas
1     1  A1  ttt  efe
2     0  A1  qqq  pfo
3    13  L3  nnn  scs
4     4  A3  lll  grj
5   NaN  A3  nnn  rpo
6     5  B1  eee  cbb
7     7  B1  xxx  asf
8     6  B1  qqq  asc
9     9  B2  bbb  wq3
10    3  A2  sss  mls

你能建议我一个聪明有效的方法来实现我的目标吗?

【问题讨论】:

    标签: python pandas dataframe replace mapping


    【解决方案1】:

    您可以将merge 与reset_index 一起使用,最后删除drop 的列:

    print (pd.merge(df_in, 
                    df_map.reset_index(), 
                    left_on=['A','B'], 
                    right_on=['X','Y'], 
                    how='left').drop(['X','Y'], axis=1))
    
         A    B    C  index
    0   A1  xxx  fas    2.0
    1   A1  ttt  efe    1.0
    2   A1  qqq  pfo    0.0
    3   L3  nnn  scs   13.0
    4   A3  lll  grj    4.0
    5   A3  nnn  rpo    NaN
    6   B1  eee  cbb    5.0
    7   B1  xxx  asf    7.0
    8   B1  qqq  asc    6.0
    9   B2  bbb  wq3    9.0
    10  A2  sss  mls    3.0
    

    另一种解决方法,谢谢Julien Marrec:

    df_in.merge(df_map.reset_index()
                      .set_index(['X','Y']), 
                left_on=['A','B'], 
                right_index=True, 
                how='left')
    

    如果想要更改列的顺序,最后一个:

    df = pd.merge(df_in, 
                  df_map.reset_index(), 
                  left_on=['A','B'], 
                  right_on=['X','Y'], 
                  how='left').drop(['X','Y'], axis=1)
    cols = df.columns[-1:].tolist() + df.columns[:-1].tolist()
    print (cols)
    ['index', 'A', 'B', 'C']
    
    df = df[cols]
    print (df)
        index   A    B    C
    0     2.0  A1  xxx  fas
    1     1.0  A1  ttt  efe
    2     0.0  A1  qqq  pfo
    3    13.0  L3  nnn  scs
    4     4.0  A3  lll  grj
    5     NaN  A3  nnn  rpo
    6     5.0  B1  eee  cbb
    7     7.0  B1  xxx  asf
    8     6.0  B1  qqq  asc
    9     9.0  B2  bbb  wq3
    10    3.0  A2  sss  mls
    

    【讨论】:

    • 你打败了我,我想出了df_in.merge(df_map.reset_index().set_index(['X','Y']), left_on=['A','B'], right_index=True, how='left')
    • 如果我想在操作过程中将索引移动 1 以使映射的索引值都是 +1 怎么办?
    • 移位索引是指合并后df['index'] += 1?
    • 还是合并前?比如shifted = df_map.reset_index()shifted['index'] = shifted['index'].shift()然后df = pd.merge(df_in, shifted, left_on=['A','B'], right_on=['X','Y'], how='left').drop(['X','Y'], axis=1)?
    • 好吧,我想在合并期间可能会这样做......如果不可能,那么我相信在此之前这样做会更好
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2023-03-15
    • 2019-10-17
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多