如何在包含列表的列上使用 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()
函数逐个圈出每行列中的所有列表元素并进行相应替换?
尝试:
explode
将列表拆分为单独的行
replace
每列使用相关字典
groupby
和 agg
返回原始结构
>>> 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.]
我在使用 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()
函数逐个圈出每行列中的所有列表元素并进行相应替换?
尝试:
explode
将列表拆分为单独的行replace
每列使用相关字典groupby
和agg
返回原始结构
>>> 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.]