簡體   English   中英

使用字典替換字符串而不刪除熊貓數據框中的字符

[英]Replace strings using a dictionary without deleting characters in a pandas dataframe

我有一種查找問題,我嘗試使用函數替換 dict zip (見下文),但這並不能完全產生我想要的結果,因為在此過程中刪除了字符(下划線)。

問題

  1. 在不刪除 df1 中的下划線的情況下生成 df3 的有效方法是什么? 在我的實際問題中,df1 更大,至少 (200, 500) 而不是 (2, 4),如下例所示。
  2. 要創建 df3,為什么我不能使用如下所示的replace dict zip ,而不刪除 df1 中的下划線?

df1 包含以特定模式排列的帶有下划線的唯一字符串:

import pandas as pd
df1 = pd.DataFrame([['1_1','1_2', '2_1', '2_2'],['1_3','1_4', '2_3', '2_4']])
df1
         0    1    2    3
    0  1_1  1_2  2_1  2_2
    1  1_3  1_4  2_3  2_4

df2 包含 df1 中某些字符串的字典:

df2 = pd.DataFrame([['1_1',234],['1_2',456],['2_3',324],['2_4',765]], columns = ['a', 'b'])
df2

     a    b
0  1_1  234
1  1_2  456
2  2_3  324
3  2_4  765

我想創建 df3,其中 df1 中包含的確切字符串替換為 df2.b 中的相應值。 但是,當我運行以下代碼時,df3 中 2_1、2_2 等的下划線對於 df2 中未包含的字符串消失。

df3 = df1.replace(dict(zip(df2.a, df2.b)))
df3

     0    1    2    3
0  234  456   21   22
1   13   14  324  765

df3 中所需的結果應該是:

     0    1    2    3
0  234  456   2_1   2_2
1   1_3   1_4  324  765

或者,或者:

     0    1    2    3
0  234  456   NaN   NaN
1   NaN   NaN  324  765

您可以使用df.mask作為替代:

s=df2.set_index('a')['b']
df1.mask(df1.isin(s.index),df1.replace(s))

     0    1    2    3
0  234  456  2_1  2_2
1  1_3  1_4  324  765

暫無
暫無

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

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