【问题标题】:Creating a new column in pandas based on a list of values inside a dictionary根据字典中的值列表在 pandas 中创建一个新列
【发布时间】:2021-04-19 18:10:50
【问题描述】:

假设我有一个包含地点位置的数据框。

df1 = pd.DataFrame({'col1': [1,2,3,4,5], 'location': ['Hackney', 'Mile End', 'Croydon', 'Edgbaston', 'Wembley'] })

然后我有一个这些地方的列表以及它们所在的主要城市存储在字典中

dict ={
['Hackney', 'Mile End', 'Croydon', 'Wembley'] : 'London',
['Edgbaston'] : 'Birmingham'
}

问题:我怎样才能创建一个新列(比如df1['city']),它使用这个字典来填充每个location 列条目所在的城市。注意:如果为此创建字典不是理想的方式,请随意提出替代方案。

理想输出:想要如下所示的内容(如果需要,字典可以扩展,这应该概括为更多条目)。

df1 = pd.DataFrame({'col1': [1,2,3,4,5], 'location': ['Hackney', 'Mile End', 'Croydon', 'Edgbaston', 'Wembley'], 'city': ['London','London','London','Birmingham','London'] })

试过:使用apply方法但似乎报错

df1['city'] = df1['location'].apply(dict)

【问题讨论】:

  • dict 正确吗?
  • 是的,不确定,但我认为我遇到的错误是在运行 apply 方法时。
  • 对不起!不,在这种情况下,我忘记将wembley 添加到dict 中。谢谢

标签: python pandas dataframe


【解决方案1】:

你的字典是无效的,你可以用list作为字典的值,也不要像dict那样调用字典,因为python代码名称,内置:

d = { 'London': ['Hackney', 'Mile End', 'Croydon'],
     'Birmingham': ['Edgbaston']}

这里可以展平列表中的值,然后使用Series.map,如果不存在则返回缺失值:

d1 = {x: k for k, v in d.items() for x in v}
print (d1)
{'Hackney': 'London', 'Mile End': 'London', 'Croydon': 'London', 'Edgbaston': 'Birmingham'}

df1['city'] = df1['location'].map(d1)
print (df1)
   col1   location        city
0     1    Hackney      London
1     2   Mile End      London
2     3    Croydon      London
3     4  Edgbaston  Birmingham
4     5    Wembley         NaN

如果字典格式是键中的元组:

d ={('Hackney', 'Mile End', 'Croydon') : 'London', ('Edgbaston', ) : 'Birmingham'}


d1 = {x: v for k, v in d.items() for x in k}
print (d1)
{'Hackney': 'London', 'Mile End': 'London', 'Croydon': 'London', 'Edgbaston': 'Birmingham'}

df1['city'] = df1['location'].map(d1)
print (df1)
   col1   location        city
0     1    Hackney      London
1     2   Mile End      London
2     3    Croydon      London
3     4  Edgbaston  Birmingham
4     5    Wembley         NaN

【讨论】:

  • 我认为“允许”将字典称为 dict - 但我同意,这可能不是一个好主意
  • 谢谢,但你能解释一下你说我的“因为 python 代码名称,公告”是什么意思吗?
  • @nishcs - 当然,因为dict 是字典bulletins。所以对于新的 dict 可以使用 d = dict() 但是如果使用 dict={'key': 'val'} 那么 ift 会被覆盖并且可能会出现奇怪的可调用错误(真的很难捕获),所以最好不要这样做。类似于list 的列表。
  • @nishcs - 就像type - 检查this
【解决方案2】:

你不能有一个带有可变键的 python dict - 这意味着你可能需要一个元组而不是一个列表

dict ={
('Hackney', 'Mile End', 'Croydon') : 'London',
('Edgbaston', ) : 'Birmingham'
}

一旦你有了这个 - 你可以使用map函数将一个位置映射到一个城市。如果您的 dict 没有键元组,您可以直接使用它,但在这种情况下 - 您可以定义一个函数 -

def get_city(location):
    for key in dict.keys():
        if location in key:
            return dict[key]

df1['location'].map(get_city)
#0        London
#1        London
#2        London
#3    Birmingham
#4          None

【讨论】:

  • s/可变/不可散列/
猜你喜欢
  • 2017-04-10
  • 1970-01-01
  • 2018-08-25
  • 2020-11-08
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 2020-08-18
相关资源
最近更新 更多