簡體   English   中英

Python 數據框 = 用來自另一個數據框的值替換列字符串中的值

[英]Python dataframe = Replace values in column string with values from another dataframe

我有以下數據框(RuleDF),其中有一列包含字符串。
字符串內部是一些應替換的值(參數)
例如。 參數 1 和參數 2

規則 ID 規則值
R-123 column1 > param1 和 column2 > param2
R-456 列 1 > 參數 1
... ...

還有另一個帶有映射的數據框(RuleMapDF):
規則 ID Rule_Param 參數值
R-123 參數 1 100
R-123 參數 2 200
R-456 參數 1 100

替換的結果將是這樣的:
另一種選擇是有一個帶有替換字符串的新列

規則 ID 規則值
R-123 第 1 列 > 100 和第 2 列 > 200
R-456 第 1 列 > 100
... ...

我很欣賞任何想法。 謝謝你。

作為@Nk03,首先為df2 中的每個Rule_ID 創建一個映射字典,以允許使用replace()方法進行字符串替換:

params = df2.groupby('Rule_ID') \
            .apply(lambda x: dict(zip(x['Rule_Param'], x['Param_Value'].astype(str)))) \
            .to_dict()

out = df1.groupby('Rule_ID') \
         .apply(lambda x: x['Rule_Value'].replace(params[x.name], regex=True))
>>> params
{'R-123': {'param1': '100', 'param2': '200'}, 'R-456': {'param1': '100'}}

>>> out
Rule_ID
R-123    0    column1 > 100 and column2 > 200
R-456    1                      column1 > 100
Name: Rule_Value, dtype: object

單程:

df3 = df1.merge(df2.groupby('Rule_ID').apply(lambda x: dict(
    x[['Rule_Param', 'Param_Value']].values)).reset_index(), on='Rule_ID', how='left')
df3['Rule_Value'] = df3.apply(lambda x: ' '.join(
    str(x[0].get(i, i)) for i in x['Rule_Value'].split()), 1)
df3 = df3.drop(0, 1)

輸出:

 Rule_ID                       Rule_Value
0   R-123  column1 > 100 and column2 > 200
1   R-456                    column1 > 100
第一步:

它將為來自 df2 的每個Rule_ID創建一個映射字典。 我們可以left merge結果與原始df1進行left merge

  Rule_ID                             Rule_Value  \
0   R-123  column1 > param1 and column2 > param2   
1   R-456                       column1 > param1   

                                0  
0  {'param1': 100, 'param2': 200}  
1                 {'param1': 100}  
第二步:

它將使用映射字典來替換Rule_Value列中的值。

第三步:

刪除map_dict列,即第0列。

如果您要更新Rule_Value列中的每個字符串

dataframe.at[index,'Rule_Value']='new value'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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