python - 从 Pandas 系列的值中查找键

标签 python dictionary pandas

我有一本字典,其值在 Pandas 系列中。我想制作一个新系列,它将在一个系列中查找一个值并返回一个具有关联键的新系列。示例:

import pandas as pd

df = pd.DataFrame({'season' : ['Nor 2014', 'Nor 2013', 'Nor 2013', 'Norv 2013',
                           'Swe 2014', 'Swe 2014',  'Swe 2013',
                           'Swe 2013', 'Sven 2013', 'Sven 2013', 'Norv 2014']})

nmdict = {'Norway' : [s for s in list(set(df.season)) if 'No' in s],
                  'Sweden' : [s for s in list(set(df.season)) if 'S' in s]}

使用 df['country'] 作为新列名称的期望结果:

       season country
0    Nor 2014  Norway
1    Nor 2013  Norway
2    Nor 2013  Norway
3   Norv 2013  Norway
4    Swe 2014  Sweden
5    Swe 2014  Sweden
6    Swe 2013  Sweden
7    Swe 2013  Sweden
8   Sven 2013  Sweden
9   Sven 2013  Sweden
10  Norv 2014  Norway

由于我的数据的性质,我必须手动制作 nmdict,如图所示。我试过了 this但无法反转我的 nmdict,因为数组的长度不同。

更重要的是,我认为我的做法可能是错误的。我来自 Excel,正在考虑 vlookup 解决方案,但根据 this answer ,我不应该以这种方式使用字典。

感谢任何答案。

最佳答案

为了让您能够跟进,我已经以冗长的方式完成了。

首先,让我们定义一个函数来确定值'country'

In [4]: def get_country(s):
   ...:     if 'Nor' in s:
   ...:         return 'Norway'
   ...:     if 'S' in s:
   ...:         return 'Sweden'
   ...:     # return 'Default Country' # if you get unmatched values

In [5]: get_country('Sven')
Out[5]: 'Sweden'

In [6]: get_country('Norv')
Out[6]: 'Norway'

我们可以使用 map 在每一行上运行 get_country。 Pandas DataFrames 也有一个 apply()其工作方式类似*。

In [7]: map(get_country, df['season'])
Out[7]: 
['Norway',
 'Norway',
 'Norway',
 'Norway',
 'Sweden',
 'Sweden',
 'Sweden',
 'Sweden',
 'Sweden',
 'Sweden',
 'Norway']

现在我们将该结果分配给名为“国家/地区”的列

In [8]: df['country'] = map(get_country, df['season'])

让我们看看最终结果:

In [9]: df
Out[9]: 
       season country
0    Nor 2014  Norway
1    Nor 2013  Norway
2    Nor 2013  Norway
3   Norv 2013  Norway
4    Swe 2014  Sweden
5    Swe 2014  Sweden
6    Swe 2013  Sweden
7    Swe 2013  Sweden
8   Sven 2013  Sweden
9   Sven 2013  Sweden
10  Norv 2014  Norway

*使用 apply() 它看起来是这样的:

In [16]: df['country'] = df['season'].apply(get_country)

In [17]: df
Out[17]: 
       season country
0    Nor 2014  Norway
1    Nor 2013  Norway
2    Nor 2013  Norway
3   Norv 2013  Norway
4    Swe 2014  Sweden
5    Swe 2014  Sweden
6    Swe 2013  Sweden
7    Swe 2013  Sweden
8   Sven 2013  Sweden
9   Sven 2013  Sweden
10  Norv 2014  Norway

更具可扩展性的国家/地区匹配器

仅伪代码:)

# Modify this as needed
country_matchers = {
    'Norway': ['Nor', 'Norv'],
    'Sweden': ['S', 'Swed'], 
}

def get_country(s):
    """
    Run the passed string s against "matchers" for each country
    Return the first matched country
    """
    for country, matchers in country_matchers.items():
        for matcher in matchers:
            if matcher in s:
                return country

关于python - 从 Pandas 系列的值中查找键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34859135/

相关文章:

python - 使用 scrapy 进行抓取

python - Shapely 和 Geos 距离法

apache-flex - 弹性3 : Can anybody see why this dictionary isn't working?

python - 交换字典的内容

Python:遍历数据框列,检查存储在数组中的条件值,并将值获取到列表

python - 在 Django 中扩展 AbstractUser 的正确方法?

python - NoReverseMatch Django 休息框架

python - 从平面字典创建嵌套字典

python - 在 pandas 中将数据从行旋转到具有特定结构的列

python - 从 pandas 数据框绘制和格式化 seaborn 图表