我有一本字典,其值在 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/