Как сделать диапазоны в большом фрейме данных? - PullRequest
0 голосов
/ 12 июня 2019

Я хочу просмотреть папку и проверить, к какому часовому поясу относится каждый файл в папке. К этому у меня есть CSV-файл

ip1         ip2           timezone
0           16777215          0
16777216    16777471       +10:00
16777472    16778239       +08:00
16778240    16779263       +11:00
16779264    16781311       +08:00
16781312    16785407       +09:00
...

Когда конкретный ip_number находится между ip1 и ip2, коррелированный часовой пояс находится в третьем столбце.

df = pd.read_csv('IP2LOCATION-LITE-DB11.csv', parse_dates=True)

path="Testordner"
os.chdir(path)
result = [i for i in glob.glob('*.{}'.format("csv"))]
os.chdir("..")
for i in result:
    df2 = pd.read_csv("twiceaweek/"+i, parse_dates=True)
    w1,x1,y1,z1=i.split('.')
    w=int(w1)
    x=int(x1)
    y=int(y1)
    ip_number= 16777216*w + 65536*x + 256*y+1

Я понятия не имею, как распределить числа между ip1 и ip2 и как объединить с ними ip_number каждого файла и получить мой часовой пояс. У вас есть идеи?

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Вы можете использовать merge_asof. Это позволяет найти последний индекс меньше, чем искомое значение, которое вам нужно. Таким образом, чтобы найти часовой пояс, когда вы нашли IP-номер, используйте:

tmp = pd.merge_asof(pd.DataFrame([ip_number], columns=['ip']), df, left_on=['ip'],
      right_on=['ip1'])
tmp = tmp[tmp.ip2>ip_number]
if len(tmp) > 0:
    tz = tmp.at[0, 'timezone']
else:
    tz = ''       # not found

В качестве альтернативы вы можете использовать searchsorted:

ix = df['ip2'].searchsorted([ip_number], 'right')[0]
if ix == len(df) or df.at[ix, 'ip1']>ip_number:
    tz = ''        # not found:
else:
    tz = df.at[ix, 'timezone']
0 голосов
/ 12 июня 2019

Вы хотите qcut:

thresholds = list(df['ip1']) + [df['ip2'].iloc[-1]]

# test:
ips = df[['ip1', 'ip2']].mean(axis=1).astype(int)

# bucketing
buckets = pd.cut(ips, thresholds,
                 right=True, 
                 include_lowest=True,
                 labels=False)

# get the labels:
df['timezone'].values[buckets]

Выход:

array(['0', '+10:00', '+08:00', '+11:00', '+08:00', '+09:00'],
  dtype=object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...