Pandas: как передавать значения по конкретному столбцу, а не по индексу при выполнении арифметической операции?

108
10

Я не знаю, ясно ли это. У меня два DataFrame:

In [1]: d1 = pd.DataFrame({'a':[1,1,1,2,2,2,3,3,3], 'b':np.random.randint(1,9,9)})  
In [2]: d1
Out[2]:
a b
0 1 1
1 1 7
2 1 5
3 2 2
4 2 8
5 2 1
6 3 5
7 3 5
8 3 8
In [3]: d2 = pd.DataFrame({'a':[1,2,3], 'd':[7,2,9]})
In [4]: d2
Out[4]:
a d
0 1 7
1 2 2
2 3 9

Я хочу найти строку в d2 с тем же "a" для каждой строки в d1 и добавить это 'a' 'd' в d2 в 'b' всех соответствующих строк в d1. Другими словами, при выполнении столбцов операции "b" плюс "d" он будет автоматически транслироваться так же, как "a" - это индекс. Результат может выглядеть так:

   a  b
0 1 8
1 1 14
2 1 12
3 2 4
4 2 10
5 2 3
6 3 14
7 3 14
8 3 17

И я знаю d1.groupby('a').apply(lambda x: x - d2[d2['a']==x.iloc[0]['a']]['d'].values) может сделай это. Но это кажется слишком сложным.

Следующий код мог бы сделать то же самое. Но я думаю, что это не правильный способ использования индекса.

d1.set_index('a', inplace=True)
d2.set_index('a', inplace=True)
d1 + d2
d1.reset_index(inplace=True)
d2.reset_index(inplace=True)

спросил(а) 2014-12-10T10:45:00+03:00 5 лет, 7 месяцев назад
1
Решение
54

Или другой способ сделать это:

df = d1.merge(d2, how='right', on='a')
df['sum'] = df.b + df.d
df

np.random.seed(0)):

   a  b  d  sum
0 1 5 7 12
1 1 8 7 15
2 1 6 7 13
3 2 1 2 3
4 2 4 2 6
5 2 4 2 6
6 3 4 9 13
7 3 8 9 17
8 3 2 9 11

Если вам не нужны все эти дополнительные столбцы, их легко удалить:

df.drop(['b','d'], axis=1, inplace=True)

ответил(а) 2014-12-10T11:23:00+03:00 5 лет, 7 месяцев назад
69

Вам не нужно менять индекс d1. Просто сделайте d2 в серии с в качестве индекса. a Затем вы можете использовать метод map Series:

d2 = d2.set_index('a').d
d1.b + d1.a.map(d2)

ответил(а) 2014-12-10T10:59:00+03:00 5 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема