Сортировать кадр данных, в котором один столбец содержит значения nan - PullRequest
0 голосов
/ 12 июня 2019

У меня есть датафрейм.

+------------+------------+------------+------+
| Item Type  | Year_Month | Total Cost | Diff |
+------------+------------+------------+------+
| Baby Food  | Jul-2017   | 3000       | 100  |
+------------+------------+------------+------+
| Baby Food  | Jun-2017   | 2900       | 100  |
+------------+------------+------------+------+
| Cereal     | Jul-2017   | 6000       | 1000 |
+------------+------------+------------+------+
| Cereal     | Jun-2017   | 5000       | 1000 |
+------------+------------+------------+------+
| Snacks     | Jul-2017   | 4500       | Nan  |
+------------+------------+------------+------+
| Chocolates | Jul-2017   | 3000       | Nan  |
+------------+------------+------------+------+
| Ice Cream  | Jul-2017   | 4000       | Nan  |
+------------+------------+------------+------+

Я хочу отсортировать фрейм данных на основе различий, но если в этом случае он содержит Nan, он должен сортироваться в соответствии с общей стоимостью. Так что мой окончательный результат будет выглядеть как

+------------+------------+------------+------+
|  Item Type | Year_Month | Total Cost | Diff |
+------------+------------+------------+------+
| Cereal     | Jul-2017   | 6000       | 1000 |
+------------+------------+------------+------+
| Cereal     | Jun-2017   | 5000       | 1000 |
+------------+------------+------------+------+
| Baby Food  | Jul-2017   | 3000       | 100  |
+------------+------------+------------+------+
| Baby Food  | Jun-2017   | 2900       | 100  |
+------------+------------+------------+------+
| Snacks     | Jul-2017   | 4500       | Nan  |
+------------+------------+------------+------+
| Ice Cream  | Jul-2017   | 4000       | Nan  |
+------------+------------+------------+------+
| Chocolates | Jul-2017   | 3000       | Nan  |
+------------+------------+------------+------+

Один из способов сделать это - разбить фрейм данных на 2 фрейма данных (один, содержащий все строки с diff, не равен Nan, а другой фрейм данных со строками, если diff равен Nan). Затем сортируйте каждый из фреймов данных на основе различий и общей стоимости, а затем объединяйте их.

+-----------+------------+------------+------+
| Item Type | Year_Month | Total Cost | Diff |
+-----------+------------+------------+------+
| Baby Food | Jul-2017   | 3000       | 100  |
+-----------+------------+------------+------+
| Baby Food | Jun-2017   | 2900       | 100  |
+-----------+------------+------------+------+
| Cereal    | Jul-2017   | 6000       | 1000 |
+-----------+------------+------------+------+
| Cereal    | Jun-2017   | 5000       | 1000 |
+-----------+------------+------------+------+


+------------+------------+------------+------+
| Item Type  | Year_Month | Total Cost | Diff |
+------------+------------+------------+------+
| Snacks     | Jul-2017   | 4500       | Nan  |
+------------+------------+------------+------+
| Ice Cream  | Jul-2017   | 4000       | Nan  |
+------------+------------+------------+------+
| Chocolates | Jul-2017   | 3000       | Nan  |
+------------+------------+------------+------+

Есть ли другой оптимизированный способ сделать это, так как это потребует больших вычислений?

Ответы [ 2 ]

1 голос
/ 12 июня 2019

При сортировке фрейма данных (df) по столбцу (здесь 'Diff') значения Nan отправляются в конец фрейма данных.Таким образом, сортируя фрейм данных по 2 столбцам («Разница» и «Общая стоимость»), мы можем получить требуемые результаты.

Вот код для того же:

    df=df.sort_values(by=['Diff','Total Cost'],ascending=False)
0 голосов
/ 12 июня 2019

Вы можете просто использовать функцию сортировки с клавишей функции:

In:

import json

jsonv = [
 {
   "Item Type": "Snacks",
   "Year_Month": "Jul-2017",
   "Total Cost": 4500,
   "Diff": "5"
 },
 {
   "Item Type": "Ice Cream",
   "Year_Month": "Jul-2017",
   "Total Cost": 4000,
   "Diff": "Nan"
 },
 {
   "Item Type": "Chocolates",
   "Year_Month": "Jul-2017",
   "Total Cost": 3000,
   "Diff": "4"
 }
]

def extract_diff(json):
    try:
        jdiff = json['Diff']
        ret = int(jdiff) if jdiff != 'Nan' else 0
        return ret
    except KeyError:
        return 0

jsonv.sort(key=extract_diff, reverse=True)

print(json.dumps(jsonv, indent=4))

Out:

[
    {
        "Item Type": "Snacks",
        "Year_Month": "Jul-2017",
        "Total Cost": 4500,
        "Diff": "5"
    },
    {
        "Item Type": "Chocolates",
        "Year_Month": "Jul-2017",
        "Total Cost": 3000,
        "Diff": "4"
    },
    {
        "Item Type": "Ice Cream",
        "Year_Month": "Jul-2017",
        "Total Cost": 4000,
        "Diff": "Nan"
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...