Pandas系列部分替换

2024-05-19 09:33:27 发布

您现在位置:Python中文网/ 问答频道 /正文

假设熊猫数据框中有一个状态列,如下所示: 这是示例数据。实际情况可能有所不同

df = pd.DataFrame({"state": ["Uttar Pradesh", "Jammu & Kashmir", "Jammu&Kashmir", "Puducherry"]})

现在的任务是将Jammu & Kashmir更改为Jammu and Kashmir,将Puducherry更改为Pondicherry

因此,我为此创建了一个词典

STATE_MAP_DICT = {
    "jammu&kashmir": "Jammu and Kashmir",
    "orissa": "Odisha",
    "orrissa": "Odisha",
    "puducherry": "pondicherry",
    "damananddiu": "Dadra and Nagar Haveli"
}

然后

df['state'] = df["state"].astype(str).str.replace(' ','').str.lower().replace(STATE_MAP_DICT)

期望:

["Uttar Pradesh", "Jammu and Kashmir", "Jammu and Kashmir", "pondicherry"]

输出:

["uttarpradesh", "Jammu and Kashmir", "Jammu and Kashmir", "pondicherry"] # Uttar Pradesh

自从我使用replace()和lower()以来发生了更改

有没有办法解决这个问题


Tags: and数据mapdfdictreplacestatestr
3条回答

您可以使用numpy.where并在替换和降低字符串后检查字典键中是否存在值。如果是,我们想替换它,如果不是-我们不做任何更改:

import numpy as np

val = df["state"].str.replace(' ','').str.lower()

df['state'] = np.where(val.isin(STATE_MAP_DICT.keys()),
                       val.replace(STATE_MAP_DICT),
                       df['state']
                       )

输出:

                state
0       Uttar Pradesh
1   Jammu and Kashmir
2   Jammu and Kashmir
3         pondicherry

您可以使用map方法和fillna

df["state"] = df["state"].astype(str).str.replace(' ','').str.lower().map(STATE_MAP_DICT).fillna(df["state"])

输出:

    state
0   Uttar Pradesh
1   Jammu and Kashmir
2   Jammu and Kashmir
3   pondicherry

只需将以下条目添加到词典中:

{
  'pondicherry': 'Pondicherry',
  'uttarpradesh' 'Uttar Pradesh'
}

或者,使用自定义函数代替str

def f(s):
  s2= s.replace(' ', '').lower()
  if s2 in STATE_MAP_DICT:
    return STATE_MAP_DICT[s2]
  return s

df['state'] = df["state"].apply(f)

相关问题 更多 >

    热门问题