#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