【发布时间】: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。 - 我有办法保留
229XYZ和2345OZ的值(我不希望值是 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 而第二个是 对象类型
【问题讨论】: