如何使用Pandas系列作为另一个系列的查找

时间:2017-11-17 14:15:10

标签: python pandas series lookup-tables

对于两个系列:一个带有数字标识符,另一个是将这些标识符与名称相关联的查找,我该如何加入它们?例如:

带有数字ID的系列

data_series = pd.Series(np.random.randint(0,100,5),
                        index = ["id_"+i for i in np.arange(5).astype('str')])
print(data_series)

id_0    38
id_1    35
id_2    36
id_3    32
id_4    94
dtype: int64

有要查找名称的系列:

name_lookup_series = pd.Series(['Google','YouTube','Facebook','Baidu','Wikipedia'],
                        index=["id_"+i for i in np.arange(5).astype('str')])
print(name_lookup_series)

id_0       Google
id_1      YouTube
id_2     Facebook
id_3        Baidu
id_4    Wikipedia
dtype: object

所需数据框

Google       38
YouTube      35
Facebook     36
Baidu        32
Wikipedia    94
dtype: int64

我能够通过劈开Pandas-fu来做到这一点,但这种常见的join - 看起来操作我认为有一种更惯用的方式来做到这一点。我目前的方法:

data_series.index = data_series.index.map(lambda x: name_lookup_series.loc[x])

有没有其他方法可以做到这一点,最好是使用更清晰的代码并在一行中?

2 个答案:

答案 0 :(得分:2)

仅使用rename - 因为使用index

s = data_series.rename(name_lookup_series)
#it is same as
#s = data_series.rename(index=name_lookup_series)
print (s)
Google       29
YouTube      57
Facebook     48
Baidu        16
Wikipedia    14
dtype: int32

另一个解决方案 - 有点复杂 - 转换为Seriesmap

data_series.index = data_series.index.to_series().map(name_lookup_series)
print (data_series)
Google       29
YouTube      57
Facebook     48
Baidu        16
Wikipedia    14
dtype: int32

答案 1 :(得分:1)

如果您的数据与其指数完全一致:

Task 1 with Item 1
Task 2 with Item 1
Task 3 with Item 1
Task 1 with Item 2
Task 2 with Item 2
Task 3 with Item 2
Task 1 with Item 3
Task 2 with Item 3
Task 3 with Item 3

如果它并不总是在索引上对齐,则抛出pd.Series.align。这很好地为您提供了一个可以传递给pd.concat((name_lookup_series, data_series), axis=1) # 0 1 # id_0 Google 13 # id_1 YouTube 6 # id_2 Facebook 22 3 id_3 Baidu 77 # id_4 Wikipedia 42 的元组。

.concat()