Попытка поиска значения из pandas фрейма данных в диапазоне двух строк в индексном фрейме данных - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть два фрейма данных - " grower_moo " и " ценообразование " в блокноте Python для анализа собранных культур и ценовых выплат производителям.

цена - это индексный фрейм данных, а grower_moo имеет различные уникальные тикеты с информацией о каждой загрузке.

Мне нужно вывести цену за тонну из индекса оценки в новый столбец данных о нагрузке, если Fat этой нагрузки не больше, чем следующая Мокрый жир .

Ниже приведен образец .head() каждого кадра данных и кода, который я пробовал. Я получил ошибку ValueError: Can only compare identically-labeled Series objects.


pricing
    Price_Per_Ton   Wet_Fat
0       306            10
1       339            11
2       382            12
3       430            13
4       481            14
5       532            15
6       580            16
7       625            17
8       665            18
9       700            19
10      728            20
11      750            21
12      766            22
13      778            23
14      788            24
15      797            25

grower_moo
    Load Ticket     Net Fruit Weight  Net MOO  Percent_MOO  Fat
0   L2019000011817     56660           833     1.448872    21.92
1   L2019000011816     53680           1409    2.557679    21.12
2   L2019000011815     53560           1001    1.834644    21.36
3   L2019000011161     62320           2737    4.207080    21.41
4   L2019000011160     57940           1129    1.911324    20.06

grower_moo['price_per_ton'] = max(pricing[pricing['Wet_Fat'] < grower_moo['Fat']]['Price_Per_Ton'])

Пример вывода - grower_moo['Fat'] из 13,60 меньше 14 жиров, поэтому цена за тонну составляет 430 * 1030 $ *

grower_moo_with_price
    Load Ticket     Net Fruit Weight  Net MOO  Percent_MOO  Fat    price_per_ton
0   L2019000011817     56660           833     1.448872    21.92      750
1   L2019000011816     53680           1409    2.557679    21.12      750
2   L2019000011815     53560           1001    1.834644    21.36      750
3   L2019000011161     62320           2737    4.207080    21.41      750
4   L2019000011160     57940           1129    1.911324    20.06      728

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Это похоже на работу для слияния "как есть", pd.merge_asof ( документация ):

Это похоже на левое соединение, за исключением того, что мы сопоставляем на ближайшем ключе, а не на равных ключах. Оба кадра данных должны быть отсортированы по ключу.

Для каждой строки в левом фрейме данных:

«обратный» поиск [по умолчанию] выбирает последнюю строку в правом фрейме данных, чья клавиша «on» меньше или равна левой key.

В следующем коде я использую входные данные вашего примера, но с именами столбцов используйте подчеркивания _ вместо пробелов .

# Required by merge_asof: sort keys in left DataFrame
grower_moo = grower_moo.sort_values('Fat')

# Required by merge_asof: key column data types must match
pricing['Wet_Fat'] = pricing['Wet_Fat'].astype('float') 

# Perform the asof merge
res = pd.merge_asof(grower_moo, pricing, left_on='Fat', right_on='Wet_Fat')

# Print result
res
      Load_Ticket  Net_Fruit_Weight  Net_MOO  Percent_MOO    Fat  Price_Per_Ton  Wet_Fat
0  L2019000011160             57940     1129     1.911324  20.06            728     20.0
1  L2019000011816             53680     1409     2.557679  21.12            750     21.0
2  L2019000011815             53560     1001     1.834644  21.36            750     21.0
3  L2019000011161             62320     2737     4.207080  21.41            750     21.0
4  L2019000011817             56660      833     1.448872  21.92            750     21.0

# Optional: drop the key column from the right DataFrame
res.drop(columns='Wet_Fat')
      Load_Ticket  Net_Fruit_Weight  Net_MOO  Percent_MOO    Fat  Price_Per_Ton
0  L2019000011160             57940     1129     1.911324  20.06            728
1  L2019000011816             53680     1409     2.557679  21.12            750
2  L2019000011815             53560     1001     1.834644  21.36            750
3  L2019000011161             62320     2737     4.207080  21.41            750
4  L2019000011817             56660      833     1.448872  21.92            750
0 голосов
/ 18 февраля 2020
concat_df = pd.concat([grower_moo, pricing], axis)
cocnat_df = concat_df[concat_df['Wet_Fat'] < concat_df['Fat']]
del cocnat_df['Wet_Fat']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...