Панды вставляют строки в монотонно увеличивающийся кадр данных, используя itertuples - PullRequest
0 голосов
/ 03 июня 2018

Я некоторое время искал решение этой проблемы, и я действительно застрял!У меня есть очень большой текстовый файл, импортированный как фрейм данных panda, содержащий всего два столбца, но с сотнями тысяч до миллионов строк.Столбцы содержат дампы пакетов: один - это данные пакетов, отформатированные как ascii-представления монотонно растущих целых чисел, а второй - время пакета.Я хочу пройти через этот фрейм данных и убедиться, что фрейм данных монотонно увеличивается, и, если отсутствуют данные, вставить новые строки, чтобы список увеличился монотонно.т. е. столбец «data» должен быть заполнен соответствующим значением, но время должно быть изменено на «NaN» или «NULL» и т. д.

Ниже приведен образец данных:

              data  frame_time_epoch
303030303030303000  1527986052.485855896
303030303030303100  1527986052.491020305
303030303030303200  1527986052.496127062
303030303030303300  1527986052.501301944
303030303030303400  1527986052.506439335

Итак, у меня есть два вопроса:

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

2) Есть лилучший (более быстрый) способ сделать это, чем я предлагал?

Это может быть тривиально, хотя я действительно боролся с этим.Заранее благодарю за помощь.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Проблема за раз.Вы можете сделать дословную проверку df.data.is_monotonic_increasing.

Вставка новых индексов: лучше пойти другим путем.Вы уже знаете индекс, который вы хотите.Это дано range(min_val, max_val+1, 100).Вы можете создать пустой DataFrame с этим индексом и обновить его, используя ваши данные.

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

import pandas as pd

# test data
df = pd.read_csv(
    pd.compat.StringIO(
        """data  frame_time_epoch
303030303030303000  1527986052.485855896
303030303030303100  1527986052.491020305
303030303030303200  1527986052.496127062
303030303030303300  1527986052.501301944
303030303030303500  1527986052.506439335"""
    ),
    sep=r" +",
)

# check if the data is increasing
assert df.data.is_monotonic_increasing

# desired index range
rng = range(df.data.iloc[0], df.data.iloc[-1] + 1, 100)

# blank frame with full index
df2 = pd.DataFrame(index=rng, columns=["frame_time_epoch"])
# update with existing data
df2.update(df.set_index("data"))

# result
# frame_time_epoch
# 303030303030303000      1.52799e+09
# 303030303030303100      1.52799e+09
# 303030303030303200      1.52799e+09
# 303030303030303300      1.52799e+09
# 303030303030303400              NaN
# 303030303030303500      1.52799e+09
0 голосов
/ 04 июня 2018

Только для ознакомления: ты пробовал что-то вроде

delta = df['data'].diff()
delta[delta>0]
delta[delta<100]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...