对于两个系列:一个带有数字标识符,另一个是将这些标识符与名称相关联的查找,我该如何加入它们?例如:
带有数字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])
有没有其他方法可以做到这一点,最好是使用更清晰的代码并在一行中?
答案 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
另一个解决方案 - 有点复杂 - 转换为Series
和map
:
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()