如何使用 Pandas 系列作为另一个系列的查找
How to use a Pandas series as a lookup for another series
对于两个系列:一个带有数字标识符,另一个是将这些标识符与名称相关联的查找,我如何加入它们?示例:
具有数字 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
-looking 操作,我认为有更惯用的方法来做到这一点。我目前的方法:
data_series.index = data_series.index.map(lambda x: name_lookup_series.loc[x])
是否有另一种方法可以做到这一点,最好是使用更简洁的代码并在一行中?
仅使用 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
如果您的数据与其索引完全一致:
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
如果它并不总是与索引对齐,则抛出 pd.Series.align
。这很好地为您提供了一个可以传递给 .concat()
.
的元组
pd.concat(name_lookup_series.align(data_series), axis=1)
# 0 1
# id_0 Google 13
# id_1 YouTube 6
# id_2 Facebook 22
# id_3 Baidu 77
# id_4 Wikipedia 42
对于两个系列:一个带有数字标识符,另一个是将这些标识符与名称相关联的查找,我如何加入它们?示例:
具有数字 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
-looking 操作,我认为有更惯用的方法来做到这一点。我目前的方法:
data_series.index = data_series.index.map(lambda x: name_lookup_series.loc[x])
是否有另一种方法可以做到这一点,最好是使用更简洁的代码并在一行中?
仅使用 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
如果您的数据与其索引完全一致:
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
如果它并不总是与索引对齐,则抛出 pd.Series.align
。这很好地为您提供了一个可以传递给 .concat()
.
pd.concat(name_lookup_series.align(data_series), axis=1)
# 0 1
# id_0 Google 13
# id_1 YouTube 6
# id_2 Facebook 22
# id_3 Baidu 77
# id_4 Wikipedia 42