【问题标题】:Pandas: Get matched value between two columnsPandas:获取两列之间的匹配值
【发布时间】:2021-09-29 16:50:05
【问题描述】:

我有 2 个数据框

data1 = {'Product': ['AAA','BBB','CCC','DDD','EEE','FFF'],
        'Id': ['247610','287950','229XYZ','987340','111500','2345OZ'],
        'Price':[40,50,0,985,34,0]}

data2 = {'Product': ['AAA','BBB','CCC','DDD','EEE'],
        'Id': [508760,287950,678897,987340,111500],}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2) 

df1如下图:

  Product    Id        Price
0 AAA       247610     40
1 BBB       287950     50
2 CCC       229XYZ      0
3 DDD       987340    985
4 EEE       111500     34
5 FFF       2345OZ      0

使用这种数据类型(df1 dtype):

Product    object
Id         object
Price       int64

我希望将其与另一个 dataframe Df2 进行比较,以获得最佳 id。 df2

  Product      Id
0     AAA     508760
1     BBB     287950
2     CCC     678897
3     DDD     987340
4     EEE     111500

使用数据类型(df2.dtypes)

Product    object
Id          int64

如您所见,我无法将 我的第一个 df1 的 id 转换为 int,所以我转换为 float 以便我可以与 df2 的 id 进行比较

df1['Id'] = pd.to_numeric(df1['Id'],errors='coerce')
df1["bestID"] = (df1["Id"].isin(df2["Id"]) * df1["Id"]).replace(0, "Nope")
print(df1)

我得到下面的输出

 Product        Id  Price    bestID
0     AAA  247610.0     40      Nope
1     BBB  287950.0     50  287950.0
2     CCC       NaN      0       NaN
3     DDD  987340.0    985  987340.0
4     EEE  111500.0     34  111500.0
5     FFF       NaN      0       NaN

这里的问题是

  • 我需要 id 类型为 int 我想从 id 值中删除 .0:我可以使用

    df1 = df1.replace(np.nan, 0, regex=True) df1['Id'] = df1['Id'].astype(int)

但这里的问题是我得到了下面的 df1(这不是我需要的):

  Product      Id  Price    bestID
0     AAA  247610     40      Nope
1     BBB  287950     50  287950.0
2     CCC       0      0         0
3     DDD  987340    985  987340.0
4     EEE  111500     34  111500.0
5     FFF       0      0         0
  • 在 bestID 列中,我想要 Nan => Nope
  • 我有办法保留 229XYZ2345OZ 的值(我不希望值是 0 或 nan)
  • 或者只在229XYZ & 2345OZ 的位置放置0(如果没有解决方案)。

预期输出:

 Product        Id  Price    bestID
0     AAA    247610     40     Nope
1     BBB    287950     50     287950
2     CCC    229XYZ      0     Nope
3     DDD    987340    985     987340
4     EEE    111500     34     111500
5     FFF    2345OZ      0     Nope

有什么方法可以解决这个问题?

注意:我将 2 个文件合并到 1 个数据帧 (df1) 第一个是 datatype Id int64 而第二个是 对象类型

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    将 df2 的“Id”从 int 转换为 str 更容易:

    df2 = pd.DataFrame(data2).astype({'Id': str})
    df1['bestId'] = df1["Id"].isin(df2["Id"])
    
    >>> df1
    
      Product      Id  Price  bestId
    0     AAA  247610     40   False
    1     BBB  287950     50    True
    2     CCC  229XYZ      0   False
    3     DDD  987340    985    True
    4     EEE  111500     34    True
    5     FFF  2345OZ      0   False
    

    如果你想用 Id/Nope 替换 True/False:

    df1['bestId'] = np.where(df1['bestId'], df1['Id'], 'Nope')
    
    >>> df1
      Product      Id  Price  bestId
    0     AAA  247610     40    Nope
    1     BBB  287950     50  287950
    2     CCC  229XYZ      0    Nope
    3     DDD  987340    985  987340
    4     EEE  111500     34  111500
    5     FFF  2345OZ      0    Nope
    

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多