Умножить столбец одного кадра данных на значение из другого кадра данных, определенного по ключу - PullRequest
2 голосов
/ 04 ноября 2019

Я хочу взять большой фрейм данных с приблизительно 26 000 строк foodList и умножить столбец foodList ['food_quant'] на определенное значение из фрейма данных foodConversions. Чтобы определить это значение из foodConversions, в другом столбце foodList ['food_name'] есть строка, которая соответствует индексу foodConversions. Я делаю это для преобразования граммов разных продуктов в калории, и каждый тип пищи имеет разное количество калорий.

Я пытался делать вложенные циклы, чтобы просмотреть каждое значение в foodConversions и посмотреть, равно ли онов foodList ['food_name'], но он очень медленный и по какой-то причине никогда не завершает работу;следовательно, я бы предпочел отойти от этого метода. Я также пытался использовать applymap и лямбда-функцию, но я не думаю, что сделал это правильно. Наконец, я попытался использовать методы, описанные в другой проблеме, связанной со стековым потоком, но я не был уверен, как применить ее к моей ситуации или даже если она работает для моей ситуации. Вот ссылка на него: Умножить фрейм данных на значения из другого фрейма

Вот два фрейма данных:

foodConversions = pd.Dataframe([2,3], index=['meat','vegetables'], columns=['cal/gram'])
            cal/gram
meat        2
vegetables  3
foodList = pd.Dataframe([['meat',40]['meat',30]['vegetables',20]['meat',10]], columns=['food_name','food_quant'])
    food_name    food_quant
0   meat         40
1   meat         30
2   vegetables   20
3   meat         10

Ирезультат должен выглядеть следующим образом:

    food_name    food_quant
0   meat         80
1   meat         60
2   vegetables   60
3   meat         20

Надеюсь, это имело смысл, я старался быть максимально тщательным, поэтому прошу прощения за длинное объяснение. Спасибо всем за помощь!

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Попробуйте использовать:

print(foodList.set_index('food_name').mul(foodConversions.reindex(foodList['food_name'])['cal/gram'], axis=0).reset_index())

Вывод:

    food_name  food_quant
0        meat          80
1        meat          60
2  vegetables          60
3        meat          20
0 голосов
/ 04 ноября 2019

Мы можем сделать reindex или loc или map или merge

reindex|loc

df2.assign(food_quant=df2.food_quant*(df1['cal/gram'].reindex(df2.food_name).values))# change reindex to loc
Out[121]: 
    food_name  food_quant
0        meat          80
1        meat          60
2  vegetables          60
3        meat          20

map|replace

df2.assign(food_quant=df2.food_quant*df2.food_name.map(df1['cal/gram']))
df2.assign(food_quant=df2.food_quant*df2.food_name.replace(df1['cal/gram']))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...