delvin-fil
@delvin-fil
Crazy Linux-admin

Как отстортировать CSV по нечисловому значению?

Имеем вот такой файл.
Используя python:

import pandas as pd
import numpy as np

mydata = pd.read_csv('ip.csv')
mydata.index = np.arange(1, len(mydata) + 1)
anon = mydata.query("Anonymity == 'anonymous'")
port = anon.query("Port == 80")
port.to_csv('port80.csv', index=False)

Получаем:

IP Address,Port,Code,Country,Anonymity,Google,Https,Last Checked
146.196.48.2,80,BD,Bangladesh,anonymous,no,no,15 secs ago
45.79.110.81,80,US,United States,anonymous,yes,no,15 secs ago
172.104.111.212,80,JP,Japan,anonymous,no,no,15 secs ago
219.78.228.211,80,HK,Hong Kong,anonymous,no,no,15 secs ago
41.188.149.79,80,TZ,Tanzania,anonymous,no,no,15 secs ago
165.154.226.12,80,TW,Taiwan,anonymous,yes,no,15 secs ago
139.99.237.62,80,AU,Australia,anonymous,yes,no,15 secs ago
165.154.243.53,80,TW,Taiwan,anonymous,yes,no,15 secs ago
42.3.182.149,80,HK,Hong Kong,anonymous,no,no,15 secs ago
38.94.109.12,80,US,United States,anonymous,no,no,15 secs ago
165.154.225.65,80,HK,Hong Kong,anonymous,no,no,15 secs ago
49.207.36.81,80,IN,India,anonymous,yes,no,15 secs ago
81.200.123.74,80,RU,Russian Federation,anonymous,no,no,15 secs ago
112.120.41.171,80,HK,Hong Kong,anonymous,no,no,15 secs ago
51.250.80.131,80,RU,Russian Federation,anonymous,no,yes,15 secs ago
45.142.106.3,80,HK,Hong Kong,anonymous,yes,no,15 secs ago
8.209.246.6,80,JP,Japan,anonymous,yes,no,15 secs ago
42.3.27.14,80,HK,Hong Kong,anonymous,no,no,15 secs ago
38.94.109.7,80,US,United States,anonymous,,no,11 mins ago
3.1.248.232,80,SG,Singapore,anonymous,,no,31 mins ago
117.54.114.100,80,ID,Indonesia,anonymous,,no,41 mins ago
43.154.216.109,80,HK,Hong Kong,anonymous,,no,50 mins ago
138.2.89.217,80,SG,Singapore,anonymous,,no,50 mins ago
155.138.197.162,80,US,United States,anonymous,,no,50 mins ago
51.159.162.151,80,FR,France,anonymous,no,yes,55 mins ago
43.204.16.38,80,IN,India,anonymous,no,no,1 hour 10 mins ago
54.66.104.168,80,AU,Australia,anonymous,yes,no,1 hour 20 mins ago
216.137.184.253,80,US,United States,anonymous,yes,no,1 hour 20 mins ago
185.108.226.143,80,NL,Netherlands,anonymous,yes,no,1 hour 20 mins ago
117.54.114.102,80,ID,Indonesia,anonymous,no,no,1 hour 20 mins ago

Все хорошо, но я немогу отфильтровать по secs ago в столбце "Last Checked".
На bash все получается:

grep secs port80.csv |sed -e "s/ /-/g" -e "s/,80,/:80 /g" -e "s/,/ /g"|awk '{print $1 , $3 , $7}'|sed "s/-/ /g"

146.196.48.2:80 Bangladesh 15 secs ago
45.79.110.81:80 United States 15 secs ago
172.104.111.212:80 Japan 15 secs ago
219.78.228.211:80 Hong Kong 15 secs ago
41.188.149.79:80 Tanzania 15 secs ago
165.154.226.12:80 Taiwan 15 secs ago
139.99.237.62:80 Australia 15 secs ago
165.154.243.53:80 Taiwan 15 secs ago
42.3.182.149:80 Hong Kong 15 secs ago
38.94.109.12:80 United States 15 secs ago
165.154.225.65:80 Hong Kong 15 secs ago
49.207.36.81:80 India 15 secs ago
81.200.123.74:80 Russian Federation 15 secs ago
112.120.41.171:80 Hong Kong 15 secs ago
51.250.80.131:80 Russian Federation 15 secs ago
45.142.106.3:80 Hong Kong 15 secs ago
8.209.246.6:80 Japan 15 secs ago
42.3.27.14:80 Hong Kong 15 secs ago


Как получить такой же результат на python?
Спасибо!
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
@holodoz
Alex F, если нужны только строки с секундами, то df = df[df['Last Checked'].str.contains("sec")==True]

Оставлю старый ответ на неверно понятый вопрос для истории ниже

Можно вытащить числа из строки с помощью регулярки, перевести всё в секунды, записать в новый столбец и фильтровать, сортировать
Часть с регуляркой я так вижу
import re

num_finder = re.compile('(?:(\d{1,10})\shours?)?(?:\s?(\d{1,2})\smins?)?(?:\s?(\d{1,2}))?')
search_result = num_finder.match(value_goes_here)

hours = int(search_result.group(1)) if search_result.group(1) else 0
mins = int(search_result.group(2)) if search_result.group(2) else 0
secs = int(search_result.group(3)) if search_result.group(3) else 0

seconds_passed = hours * 3600 + mins * 60 + secs
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Wispik
Честно уверен, что есть либо какая-то библиотека, либо это просто можно покрасивее сделать. Но на первый взгляд пришла такая мысль (выглядит не очень красиво, зато работает)))
reader = csv.reader(open("ip.csv"))

def _sort(s):
    if s.lower() == 'last checked':
        return 0
    res = 0
    s = s.split('ago')[0].strip()
    if 'hour' in s:
        _s = s.split('hour')
        res += int(_s[0]) * 60 * 60
        s = _s[1].strip()
    if 'mins' in s:
        _s = s.split('mins')
        res += int(_s[0]) * 60
        s = _s[1].strip()
    if 'min' in s:
        _s = s.split('min')
        res += int(_s[0]) * 60
        s = _s[1].strip()
    if 'secs' in s:
        _s = s.split('secs')
        res += int(_s[0])
    return res

sort_reader = sorted(reader, key=lambda x: _sort(x[7]))
Ответ написан
@ppttzz
Резделить числовые значения и нечисловые на два столбца с помощью регулярных выражений
Открыть csv с помощью Pandas создав датафрейм.
import pandas as pd
df = pd.read_csv('my.csv')
Отсортировать командой df.sort_values
параметры посмотреть тут
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
07 мая 2024, в 14:38
8000 руб./за проект
07 мая 2024, в 14:38
15000 руб./за проект
07 мая 2024, в 14:36
70000 руб./за проект