2014-12-10 2 views
0

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

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 

Я хочу, чтобы найти строку в Д2 с тем же «а» для каждой строки в d1, и добавить «в» 's «D» в d2 к «В» все соответствующие строки в 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) 
+0

Есть ли причина не держать столбец «a» в качестве индекса? Тогда вам не нужно постоянно устанавливать/переустанавливать индекс. – Rob

+0

@Rob Потому что 'a' может иметь повторяющиеся значения. Дублирующий индекс не может использовать все функции панд. – Yyao

ответ

1

Или еще один способ сделать это:

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) 
2

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

d2 = d2.set_index('a').d 
d1.b + d1.a.map(d2) 
Смежные вопросы