簡體   English   中英

使用具有相應替換項的另一個pandas df替換pandas列中的值

[英]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中做到這一點? 謝謝!

設定

考慮數據框inventoryreplace_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM