pandas сопоставляет серию с другой серией по 2 столбцам фрейма данных

#python #pandas #merge

#python #pandas #слияние

Вопрос:

Допустим, у меня есть фрейм данных с 2 столбцами:

 indexes = pd.Series(np.arange(10))
np.random.seed(seed=42)
values = pd.Series(np.random.normal(size=10))
df = pd.DataFrame({"unique_col": indexes, "value": values})

# df:
   unique_col     value
0           0  0.496714
1           1 -0.138264
2           2  0.647689
3           3  1.523030
4           4 -0.234153
5           5 -0.234137
6           6  1.579213
7           7  0.767435
8           8 -0.469474
9           9  0.542560
  

И я хочу сопоставить эту серию с этим фреймом данных:

 uniq = pd.Series([1,3,5,6], index=[20, 45, 47, 51], name="unique_col")

# uniq
20    1
45    3
47    5
51    6
Name: unique_col, dtype: int64
  

У uniq серии есть специальный индекс, который я не хочу терять. unique_col находится int здесь, но в моем реальном случае это сложная и уникальная строка.

Я хочу сопоставить unique_col и извлечь value , в настоящее время я делаю это следующим образом:

 uniqdf = pd.DataFrame(uniq)
mergedf = pd.merge(uniqdf, df, on="unique_col", how="left").set_index(uniq.index)
myresult = mergedf["value"]

# myresult
20   -0.138264
45    1.523030
47   -0.234137
51    1.579213
Name: value, dtype: float64
  

Это необходимо? Есть ли более простой способ, который не включает pd.merge и преобразование из Series в DataFrame ?

Комментарии:

1. вы могли бы посмотреть на превращение второй серии в словарь. Где ключ — это ваше значение uniq, а значение — индекс. Затем просто используйте map функцию;

Ответ №1:

Это то, что вам нужно?

 s=df.set_index('unique_col').value.reindex(uniq).values
pd.Series(s,index=uniq.index)
Out[147]: 
20   -0.138264
45    1.523030
47   -0.234137
51    1.579213
dtype: float64
  

Ответ №2:

Просто используйте map :

 uniq.map(df.set_index('unique_col')['value'])
  

 20   -0.138264
45    1.523030
47   -0.234137
51    1.579213
Name: unique_col, dtype: float64