Применить функцию к кадру данных на основе столбца с другим кадром данных на основе индекса - PullRequest
0 голосов
/ 16 января 2019

Я хотел бы выполнить некоторую операцию (например, x*apples^y) для значений столбцов яблок, исходя из их цвета. Соответствующие значения находятся в отдельном кадре данных:

import pandas as pd
import numpy as np
df1 = pd.DataFrame({'apples': [2, 1, 5, 6, 7], 'color': [1, 1, 1, 2, 2]})
df2 = pd.DataFrame({'x': [100, 200], 'y': [0.5, 0.3]}).set_index(np.array([1, 2]), 'color')

Я ищу следующий результат:

   apples        color
0  100*2^0.5      1
1  100*1^0.5      1
2  100*5^0.5      1
3  200*6^0.3      2
4  200*7^0.3      2

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я думаю, вам нужно pandas.merge -

temp = df1.merge(df2, left_on='color', right_index= True, how='left')
df1['apples'] = (temp['x']*(temp['apples'].pow(temp['y'])))

выход

       apples  color
0  141.421356      1
1  100.000000      1
2  223.606798      1
3  342.353972      2
4  358.557993      2
0 голосов
/ 16 января 2019

Использовать DataFrame.join с левым соединением по умолчанию, а затем работать с добавленными столбцами:

df = df1.join(df2, on='color')
df['apples'] = df['x'] * df['apples'] ** df['y']
print (df)
       apples  color    x    y
0  141.421356      1  100  0.5
1  100.000000      1  100  0.5
2  223.606798      1  100  0.5
3  342.353972      2  200  0.3
4  358.557993      2  200  0.3

Осталось левое соединение, поэтому добавление в новый столбец в df1 должно работать:

df = df1.join(df2, on='color')
df1['apples'] = df['x'] * df['apples'] ** df['y']
print (df1)
       apples  color
0  141.421356      1
1  100.000000      1
2  223.606798      1
3  342.353972      2
4  358.557993      2

Другая идея - использовать double map:

df1['apples'] = df1['color'].map(df2['x']) * df1['apples'] ** df1['color'].map(df2['y'])
print (df1)
       apples  color
0  141.421356      1
1  100.000000      1
2  223.606798      1
3  342.353972      2
4  358.557993      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...