Порядок по тексту со строками и цифрами - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу заказать это по столбцу "market", но обычные "sort_values" от pandas не работают.Я хочу заказать по сету и игре.Не могли бы вы помочь?

+---+------------------------------+----------+----------+
|   |            market            |  stake   |  profit  |
+---+------------------------------+----------+----------+
| 0 | Game Winner (Set 1, Game 1)  | 1605.50  | -1020.30 |
| 1 | Game Winner (Set 1, Game 10) | 2825.00  | 85.42    |
| 2 | Game Winner (Set 1, Game 11) | 700.00   | 100.00   |
| 3 | Game Winner (Set 1, Game 12) | 2280.40  | 9.60     |
| 4 | Game Winner (Set 1, Game 2)  | 5688.30  | -1516.84 |
| 5 | Game Winner (Set 1, Game 3)  | 2604.00  | -1205.70 |
| 6 | Game Winner (Set 1, Game 4)  | 4638.56  | -1817.72 |
| 7 | Game Winner (Set 1, Game 5)  | 3600.00  | 1488.00  |
| 8 | Game Winner (Set 1, Game 6)  | 8851.72  | -2776.65 |
| 9 | Game Winner (Set 1, Game 7)  | 10477.00 | -2097.00 |
+---+------------------------------+----------+----------+

Это мой ДФ.Код, который я использовал, выглядит следующим образом:

test = df.groupby("market")[["stake","profit"]].sum().reset_index().sort_values("market")

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Используя natsort

from natsort import natsorted, ns

l=df.market.tolist()

df=df.set_index('market').loc[natsorted(l)].reset_index()
df
Out[130]: 
                           market     stake   profit
0   Game Winner (Set 1, Game 1)     1605.50 -1020.30
1   Game Winner (Set 1, Game 2)     5688.30 -1516.84
2   Game Winner (Set 1, Game 3)     2604.00 -1205.70
3   Game Winner (Set 1, Game 4)     4638.56 -1817.72
4   Game Winner (Set 1, Game 5)     3600.00  1488.00
5   Game Winner (Set 1, Game 6)     8851.72 -2776.65
6   Game Winner (Set 1, Game 7)    10477.00 -2097.00
7   Game Winner (Set 1, Game 10)    2825.00    85.42
8   Game Winner (Set 1, Game 11)     700.00   100.00
9   Game Winner (Set 1, Game 12)    2280.40     9.60
0 голосов
/ 26 апреля 2018

Вы можете попробовать переиндексировать, основываясь на извлеченных числах:

idx = (df.market.str
         .extract(r'(?P<set>\d+),\s*Game\s*(?P<game>\d+)', expand=True)
         .astype(int)
         .sort_values(['set','game'])
         .index)

df.reindex(idx)
0 голосов
/ 26 апреля 2018

Сортировка сработала правильно.Ваш сет и игра объединены в одну строку.Строки сортируются по порядку, а не по числовому значению.Если вы хотите отсортировать их по этим числам, вы должны выделить числовые части, преобразовать их в целые числа и отсортировать по этим значениям, а не по сцепленным строковым значениям.

достаточно, чтобы вы переехали?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...