【问题标题】:Pandas - Replacing Values by Looking Up in an Another DataframePandas - 通过在另一个数据框中查找来替换值
【发布时间】:2018-12-17 15:39:25
【问题描述】:

我有一个问题需要用 Python3 在我的 pandas 数据框中解决。我有两个数据框 - 第一个是 as;

    ID Name  Linked Model 1  Linked Model 2  Linked Model 3
0  100    A          1111.0          1112.0             NaN
1  101    B          1112.0          1113.0          1115.0
2  102    C             NaN             NaN             NaN
3  103    D          1114.0             NaN             NaN
4  104    E          1114.0          1111.0          1112.0

第二个是;

   Model ID Name
0      1111    A
1      1112  A,B
2      1113    C
3      1114    D
4      1115    Q
5      1116    Z
6      1117    E
7      1118    W

所以代码应该在 - 例如 Linked Model 1 列中查找值,并在第二个数据框的 Name 列中找到相应的值,以便 ID可以用名字替换,就像结果一样;

正如您在结果输出中看到的那样,None 保持为 None(可以替换为 numpy N/As),并且第二个数据帧中的名称现在替换为它们对应的 Model ID第一个数据帧。

我期待听到您的解决方案!

谢谢

【问题讨论】:

  • 这是replace 问题。
  • 然而,这个问题很好,但附加图片的基本问题仍然存在,这确实无助于重现问题并给出答案,最好放置代码语法会有所帮助。创建数据框和设备解决方案非常耗时。
  • @coldspeed,谢谢,这确实有很大帮助,因为展示图片是不可能的!
  • 是的,没错。对不起,图片源数据,感谢您的反馈!经验教训

标签: python pandas dataframe


【解决方案1】:

初始化替换字典并使用df.replace 将这些ID 映射到名称。

m = df2.set_index('Model ID')['Name'].to_dict()
v = df.filter(like='Linked Model')
df[v.columns] = v.replace(m)

df
    ID Name Linked Model 1 Linked Model 2 Linked Model 3
0  100    A              A            A,B            NaN
1  101    B            A,B              C              Q
2  102    C            NaN            NaN            NaN
3  103    D              D            NaN            NaN
4  104    E              D              A            A,B

【讨论】:

    【解决方案2】:

    第一次尝试回答一个 python 问题,所以虽然这肯定比coldspeed 的回答要长,但使用meltmergepivot 函数对我来说更有意义。

    import pandas as pd
    import numpy as np
    
    # make an object from the first dataset
    
    df_1 = pd.DataFrame(
      {"ID" : [100, 101, 102, 103, 104],
      "Name" : ["A", "B", "C", "D", "E"],
      "Linked Model 1" : [1111, 1112, np.nan, 1114, 1114],
      "Linked Model 2" : [1112, 1113, np.nan, np.nan, 1111],
      "Linked Model 3" : [np.nan, 1115, np.nan, np.nan, 1112]})
    
    # make an object for the second data set
    
    df_2 = pd.DataFrame(
      {"Model ID" : [1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118],
      "Name" : ["A", "A,B", "C", "D", "Q", "Z", "E", "W"]})
    
    # tidy the data
    df_1 = pd.melt(df_1, ["ID", "Name"]) 
    
    # left join the second data set
    df_1 = pd.merge(df_1, df_2, how='left', left_on='value', right_on='Model ID').reset_index()
    
    #pivot the data back out to achieve the desired format
    df_1 = df_1.pivot_table(index='ID', 
                            columns='variable', 
                            values='Name_y', 
                            aggfunc='first', 
                            dropna=False))
    
    variable Linked Model 1 Linked Model 2 Linked Model 3
    ID                                                   
    100                   A            A,B            NaN
    101                 A,B              C              Q
    102                 NaN            NaN            NaN
    103                   D            NaN            NaN
    104                   D              A            A,B
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-07
      • 2017-06-09
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 2021-11-12
      相关资源
      最近更新 更多