Как я могу узнать, насколько часто число в определенном диапазоне - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть фрейм данных, который содержит 2 столбца ('timestamp', 'ip') и 400 строк

timestamp     ip

1000          ip1

1500          ip2
 .             .
 .             .

11000         ip1
 .             . 
 .             .

50000         ip5

, что я хочу сделать, это проверить, если разница между каждой 10-й строкой и 1 строкойкаждые 10 строк в столбце 1 равны <= 10, если да, получите значение, которое больше всего повторяется в столбце 2, и удалите его из фрейма данных только в тех строках, где тест равен true </p>

Так что я хочуget - создать цикл с шагом 10, пройти первый столбец и выполнить тест между 10-й и 1-й строкой, если результат равен true. Я делаю еще один цикл, чтобы получить 10 строк в списке, а затем получить ip, которыйповторяет большинство в этом списке и пытается удалить из исходного кадра данных, но я не уверен, что это правильный подход, как мой код выглядит так:

#created an empty list
list=[]
#create a dataframe from the csv file
read=pd.read_csv(r"example.csv", delimiter = ';')
#get the number of rws in the csv file
lines = sum(1 for line in open('example.csv'))
#my first loop to make the test on the  10000 with the step 10 
for i in range(0, lines-1, 10):
    if  int((read['timestamp'][i+1]))-(int (read['timestamp'][i]) )<= 10000:
# second loop the extract the result in a list
        for j  in range (i,i+10) :
           l.append(read['ip'][j])
           df = pd.DataFrame({'ip':l})
        print(df)
        l=[]

, так что результат, который я получаю из этогокод такой:

                           IP
0                          ip1
1                          ip2
2                          ip3
3                          ip4
4                          ip5
5                          ip5
6                          ip5
7                          ip1
8                          ip5
9                          ip6

All what i want to do now is to get which ip is the most frequent and how frequent is this ip that means
Ip5 :4

1 Ответ

1 голос
/ 05 ноября 2019

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

out_df = pd.DataFrame()
while len(read) > 10:
    sub_df, read = read.iloc[:10], read.iloc[10:] if len(read) > 10 else (read, pd.DataFrame())
    if sub_df.tail(1)['Time'].values[0] - sub_df.head(1)['Time'].values[0] <= 10000 and len(sub_df) == 10:
        sub_df = sub_df[sub_df["IP"] != sub_df['IP'].value_counts().index.values[0]]
    out_df = pd.concat([out_df, sub_df])

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

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