【问题标题】:Replace is producing weird answers in pandas pythonReplace 在 pandas python 中产生奇怪的答案
【发布时间】:2017-11-02 14:56:48
【问题描述】:

我正在使用字典键值对来替换一些字符串。

dict= {'MAA':'MADRAS', 'MAD':'MADRID'}

现在使用.replace(),它将MAA 替换为MADRAS,但MADRAS 的MAD 再次被MARDRID 替换。这给了我错误的输出,我有 8000 多个键值对,所以我的输出变得非常奇怪。有什么办法可以改正。

非常感谢任何建议。


我正在使用以下代码:

#creating dict from dataframe with 8k+ key value pairs.. 
iata_dict = dict(zip(df7.CityCode, df7.CityName))
for x,y in iata_dict.items():
    df6["Itinerary"] = df6["Itinerary"].str.replace(x, y) 

这是我的数据框行程中的一列,其中包含类似的数据-

BRISBANE-AKL-SCL-LIM/CIX-LIM/LAX/BNE
PER-HKG/HND/PVG-HKG/PER
PER/JNB/PER
PER-DXB/ALA-TSE/LHR-DXB/PER
BNE/LST/MEL-CHC/IVC/CHC/BNE
ANF/SCL-ATL/SLC-LAX-SYD/BNE
MAA-BOM/HYD/MAA
MEL/SIN/MEL
PER-SYD/SFO/MSO/SLC-LAX-BNE/PER

【问题讨论】:

  • 如何替换数据。你能显示代码吗
  • 不看代码我只能说你应该先替换MAD然后MAA。如果你想以两种方式替换它,你需要编写新的/更好的正则表达式,而不是使用带有字符序列的replace()
  • 嗨,我正在使用以下代码: iata_dict = dict(zip(df7.CityCode, df7.CityName)) #creating dict from dataframe with 8k+ key value pairs.. for x,y in iata_dict .items(): df6["行程"] = df6["行程"].str.replace(x, y)
  • 请包含 DataFrame 的最小示例 - 例如 df6.head(7)。以及该示例的预期结果。 --- minimal reproducible example
  • @wwii 这是我的数据框的一列-BNE-AKL-SCL-LIM/CIX-LIM/LAX/BNE PER-HKG/HND/PVG-HKG/PER PER/JNB/PER PER-DXB/ALA-TSE/LHR-DXB/PER BNE/LST/MEL-CHC/IVC/CHC/BNE ANF/SCL-ATL/SLC-LAX-SYD/BNE MAA-BOM/HYD/MAA MEL/SIN/MEL 我将用{'MAA':'Madras','MAD':'MADRID','SYD':'SYDNEY',....... upto 8K key value pairs} 替换这些。 MAA 应该给我MADRAS,但我得到了MADRIDRASMAD 再次被“马德里”取代。

标签: python pandas dictionary replace


【解决方案1】:

它需要优化,但这有效:

import re
di= {'MAA':'MADRAS', 'MAD':'MADRID'}
st = ['BRISBANE-AKL-SCL-LIM/CIX-LIM/LAX/BNE',
'PER-HKG/HND/PVG-HKG/PER',
'PER/JNB/PER',
'PER-DXB/ALA-TSE/LHR-DXB/PER',
'BNE/LST/MEL-CHC/IVC/CHC/BNE',
'ANF/SCL-ATL/SLC-LAX-SYD/BNE',
'MAA-BOM/HYD/MAA',
'MEL/SIN/MEL',
'PER-SYD/SFO/MSO/SLC-LAX-BNE/PER']
for s in st:
    for d in di.keys():
        r = re.compile('(?![A-Z])*' + d + '(?![A-Z])*')
        s = re.sub(r, di[d],s)
    print(s)

这个正则表达式检查我们替换的单词没有被其他单词或字母包围。其他周围的符号很好。 如果你想优化这段代码,你可以在字符串循环之前编译表达式。

这是输出:

BRISBANE-AKL-SCL-LIM/CIX-LIM/LAX/BNE
PER-HKG/HND/PVG-HKG/PER
PER/JNB/PER
PER-DXB/ALA-TSE/LHR-DXB/PER
BNE/LST/MEL-CHC/IVC/CHC/BNE
ANF/SCL-ATL/SLC-LAX-SYD/BNE
MADRAS-BOM/HYD/MADRAS
MEL/SIN/MEL
PER-SYD/SFO/MSO/SLC-LAX-BNE/PER

【讨论】:

  • 嗨@CrazyElf,它给了我MADRIDRAS MAA 而不是MADRAS
  • 这很奇怪。我有这个输出: BRISBANE-AKL-SCL-LIM/CIX-LIM/LAX/BNE PER-HKG/HND/PVG-HKG/PER PER/JNB/PER PER-DXB/ALA-TSE/LHR-DXB/ PER BNE/LST/MEL-CHC/IVC/CHC/BNE ANF/SCL-ATL/SLC-LAX-SYD/BNE MADRAS-BOM/HYD/MADRAS MEL/SIN/MEL PER-SYD/SFO/MSO/SLC-LAX -BNE/PER
  • 您使用哪个版本的 Python?可能是一把钥匙。我的是 3.6
  • 嗨@CrazyElf,我知道它很奇怪,我的python也是3.6,我的输出是- BRISBANE-AKL-SCL-LIM/CIX-LIM/LAX/BNE PER-HKG/HND/ PVG-HKG/PER PER/JNB/PER PER-DXB/ALA-TSE/LHR-DXB/PER BNE/LST/MEL-CHC/IVC/CHC/BNE ANF/SCL-ATL/SLC-LAX-SYD/BNE @ 987654326@ MEL/SIN/MEL PER-SYD/SFO/MSO/SLC-LAX-BNE/PER
  • 嗨@CrazyElf,我想在数据框中获取输出值。而不是print(s),我希望它返回df['Itinerary']。我无法得到这个东西。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-09-21
  • 2019-03-26
  • 2020-11-18
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
相关资源
最近更新 更多