【问题标题】:Wrong column mapping of pandas DataFrame from dictionary字典中pandas DataFrame的错误列映射
【发布时间】:2021-08-04 02:31:04
【问题描述】:

我正在尝试映射 2 个数据帧

L1

ship  city   code  

 NaN   aa      12    
 NaN   bb      23    
 NaN   cc      13    
 NaN   dd      43  

B1

 ship  city    
 
 21     dd     
 32     bb      
 43     aa      
 654    cc      
 34     bb     
 54     aa

 

我想将列 codeL1 映射到 B1。我尝试使用字典进行映射,所以我会得到这样的结果

Expected_Result =

ship  city   code  
 
 21    dd      43    
 32    bb      23    
 43    aa      12    
 654   cc      13    
 34    bb      23    
 54    aa      12



 code_dict = dict(zip(L1['city'],L1['code'])) 
 B1['code'] = L1['city'].map(code_dict)
 print(B1)

我得到的结果不是我所期望的。

请帮我解决这个问题。

 ship  city    code  
 
 21    dd       12    
 32    bb       23    
 43    aa       13    
 654   cc       43    
 34    bb       NaN   
 54    aa       NaN 

【问题讨论】:

  • L1 和 B1 没有共同的code 列?这是错字吗?你是根据城市加入这个的吗?如果是这样,那么21 dd 43 似乎是正确的结果。
  • 每个城市都有一个与之相关的唯一“代码”,我已将其映射到字典 - “code_dict”。将每个“城市”对应的“代码”从“L1”映射/复制到“B1”是我在这里想要实现的。
  • 那么这对你有用l1.merge(b1,on=['city'],how='inner')[['ship_y','city','code']].rename({"ship_y":"ship"},axis=1)
  • 我的实际数据集有更多列,如果我合并,我将不得不重命名每个重复的列。您能否建议使用字典或无需重命名列的解决方案?

标签: python dataframe dictionary mapping


【解决方案1】:

两个选项。

数据设置:

ship=[np.nan]*4
city=['aa','bb','cc','ddd']
code=[12,23,13,43]

ship2=[21,32,43,654,34,54]
city2=['dd','bb','aa','cc','bb','aa']

l1=pd.DataFrame({"ship":ship,"city":city,"code":code})
b1=pd.DataFrame({"ship":ship2,"city":city2})

第一次通过合并在城市:

l1.merge(b1,on=['city'],how='inner')[['ship_y','city','code']].rename({"ship_y":"ship"},axis=1)

第二次使用地图/字典:

ship_city_d = dict(zip(l1.city, l1.code)) # build the dictionary
b1['code']=b1['city'].apply(lambda x: str(ship_city_d.get(x,"Not Found")) )

注意: b1 如果没有找到 key 会有一些记录,如果不需要,你可以删除这些记录作为下一步。

【讨论】:

  • 谢谢simpleApp 第二种方法正是我想要的,你救了我。
【解决方案2】:

我想你正在寻找:

from pandas import DataFrame


df1 = DataFrame([
    {'city': 'aa', 'code': 12},
    {'city': 'bb', 'code': 23},
    {'city': 'cc', 'code': 13},
    {'city': 'dd', 'code': 43}
])

df2 = DataFrame([
    {'ship': '21', 'city': 'dd'},
    {'ship': '32', 'city': 'bb'},
    {'ship': '43', 'city': 'aa'},
    {'ship': '654', 'city': 'cc'},
    {'ship': '34', 'city': 'bb'},
    {'ship': '54', 'city': 'aa'}
])

expected_result = df2.merge(df1, on='city')
print(expected_result)

结果:

  ship city  code
0   21   dd    43
1   32   bb    23
2   34   bb    23
3   43   aa    12
4   54   aa    12
5  654   cc    13

【讨论】:

  • expected_result = df2.merge(df1, on='city') print(expected_result) 当我尝试这个时,我得到了一个重复的“ship”列。现在我有两个新列 ship_x(带有值)和 ship_y 带有(只有 Nan 值)
猜你喜欢
  • 2016-09-02
  • 1970-01-01
  • 2021-12-27
  • 2018-06-12
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 2021-08-31
  • 2018-07-13
相关资源
最近更新 更多