我一直在寻找解决方案,我真的被卡住了!我有一个非常大的文本文件,作为熊猫数据框导入,只包含两列,但有数十万到数百万行。这些列包含数据包转储:一个是格式化为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)除了我提出的方式之外,还有更好的方式(更快)的方法吗?
虽然我真的很挣扎,但这可能是微不足道的。提前感谢您的帮助。
答案 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]