如何在包含列表的列上使用 pd.DataFrame.replace

How to use pd.DataFrame.replace on a column containing lists

我在使用 pandas 替换功能时遇到问题。假设我们有一个这样的示例数据框:

df = pd.DataFrame({'State': ['Georgia', 'Alabama', 'Tennessee'],
                   'Cities': [['Atlanta', 'Albany'], ['Montgomery', 'Huntsville', 'Birmingham'], ['Nashville', 'Knoxville']]})

>>> df
       State                                Cities
0    Georgia                     [Atlanta, Albany]
1    Alabama  [Montgomery, Huntsville, Birmingham]
2  Tennessee                [Nashville, Knoxville]

现在我想将州名和城市名全部替换为缩写。我有两个定义替换值的字典:

state_abbrv = {'Alabama': 'AL', 'Georgia': 'GA', 'Tennessee': 'TN'}
city_abbrv = {'Albany': 'Alb.', 'Atlanta': 'Atl.', 'Birmingham': 'Birm.',
              'Huntsville': 'Htsv.', 'Knoxville': 'Kxv.',
              'Montgomery': 'Mont.', 'Nashville': 'Nhv.'}

在“州”列(每行仅包含一个值)上使用 pd.DataFrame.replace() 时,它按预期工作并替换所有州名称:

>>> df.replace({'State': state_abbrv})

  State                                Cities
0    GA                     [Atlanta, Albany]
1    AL  [Montgomery, Huntsville, Birmingham]
2    TN                [Nashville, Knoxville]

我希望它也能单独替换“城市”列列表中的所有匹配名称,但不幸的是它似乎不起作用,因为所有城市都没有缩写:

>>> df.replace({'Cities': city_abbrv})
      State                                Cities
0    Georgia                     [Atlanta, Albany]
1    Alabama  [Montgomery, Huntsville, Birmingham]
2  Tennessee                [Nashville, Knoxville]

如何让 pd.DataFrame.replace() 函数逐个圈出每行列中的所有列表元素并进行相应替换?

尝试:

  1. explode 将列表拆分为单独的行
  2. replace每列使用相关字典
  3. groupbyagg 返回原始结构
>>> output = df.explode("Cities").replace({"State": state_abbrv, "Cities": city_abbrv}).groupby("State", as_index=False)["Cities"].agg(list)
  State                 Cities
0    AL  [Mont., Htsv., Birm.]
1    GA           [Atl., Alb.]
2    TN           [Nhv., Kxv.]