pandas使用itertuples在单调增加的数据帧中插入行

时间:2018-06-03 20:53:38

标签: python pandas dataframe

我一直在寻找解决方案,我真的被卡住了!我有一个非常大的文本文件,作为熊猫数据框导入,只包含两列,但有数十万到数百万行。这些列包含数据包转储:一个是格式化为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循环遍历数据框,试图让下一行与当前行进行比较,如果差异超过100则添加新行,但不幸的是我因为这个问题一直在挣扎,所以在被召唤之后似乎没有一个好方法来改变这一行。

2)除了我提出的方式之外,还有更好的方式(更快)的方法吗?

虽然我真的很挣扎,但这可能是微不足道的。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

一次出现问题。您可以进行逐字检查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

答案 1 :(得分:0)

只是为了检查:你有没有试过......

delta = df['data'].diff()
delta[delta>0]
delta[delta<100]