[英]Replace values in a pandas column using another pandas df which has the corresponding replacements
我有一個名為inventory
的熊貓df,其中有一列包含Part Numbers
(AlphaNumeric)。 這些零件號中的一些已被取代,我還有一個名為replace_with
df,其中包含兩列, 'old part numbers'
和'new part numbers'
。 例如:
庫存具有以下值:
* 123AAA
* 123BBB
* 123CCC
......
和replace-具有類似的值
**oldPartnumbers** ..... **newPartnumbers**
* 123AAA ............ 123ABC
* 123CCC ........... 123DEF
因此,我需要用新數字替換庫存中的相應值。 更換后庫存將如下所示:
* 123ABC
* 123BBB
* 123DEF
有沒有一種簡單的方法可以在python中做到這一點? 謝謝!
設定
考慮數據框inventory
和replace_with
inventory = pd.DataFrame(dict(Partnumbers=['123AAA', '123BBB', '123CCC']))
replace_with = pd.DataFrame(dict(
oldPartnumbers=['123AAA', '123BBB', '123CCC'],
newPartnumbers=['123ABC', '123DEF', '123GHI']
))
選項1
map
d = replace_with.set_index('oldPartnumbers').newPartnumbers
inventory['Partnumbers'] = inventory['Partnumbers'].map(d)
inventory
Partnumbers
0 123ABC
1 123DEF
2 123GHI
選項2
replace
d = replace_with.set_index('oldPartnumbers').newPartnumbers
inventory['Partnumbers'].replace(d, inplace=True)
inventory
Partnumbers
0 123ABC
1 123DEF
2 123GHI
假設您有2 df,如下所示:
import pandas as pd
df1 = pd.DataFrame([[1,3],[5,4],[6,7]], columns = ['PN','name'])
df2 = pd.DataFrame([[2,22],[3,33],[4,44],[5,55]], columns = ['oldname','newname'])
df1:
PN oldname
0 1 3
1 5 4
2 6 7
df2:
oldname newname
0 2 22
1 3 33
2 4 44
3 5 55
在它們之間運行左連接:
temp = df1.merge(df2,'left',left_on='name',right_on='oldname')
溫度:
PN name oldname newname
0 1 3 3.0 33.0
1 5 4 4.0 44.0
2 6 7 NaN NaN
然后計算新的name
列並將其替換:
df1['name'] = temp.apply(lambda row: row['newname'] if pd.notnull(row['newname']) else row['name'], axis=1)
df1:
PN name
0 1 33.0
1 5 44.0
2 6 7.0
或者,作為一種班輪 :
df1['name'] = df1.merge(df2,'left',left_on='name',right_on='oldname').apply(lambda row: row['newname'] if pd.notnull(row['newname']) else row['name'], axis=1)
該解決方案相對較快-它使用了熊貓數據對齊和numpy的“ copyto”功能。
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'partNumbers': ['123AAA', '123BBB', '123CCC', '123DDD']})
df2 = pd.DataFrame({'oldPartnumbers': ['123AAA', '123BBB', '123CCC'],
'newPartnumbers': ['123ABC', '123DEF', '123GHI']})
# assign index in each dataframe to original part number columns
# (faster than set_index method, but use set_index if original index must be preserved)
df1.index = df1.partNumbers
df2.index = df2.oldPartnumbers
# use pandas index data alignment
df1['updatedPartNumbers'] = df2.newPartnumbers
# use numpy to copy in old part num when a new part num is not found
np.copyto(df1.updatedPartNumbers.values,
df1.partNumbers.values,
where=pd.isnull(df1.updatedPartNumbers))
# reset index
df1.reset_index(drop=True, inplace=True)
df1:
partNumbers updatedPartNumbers
0 123AAA 123ABC
1 123BBB 123DEF
2 123CCC 123GHI
3 123DDD 123DDD
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.