【问题标题】:Subtracting the rows of a column from the preceding rows in a python pandas dataframe从python pandas数据框中的前几行中减去一列的行
【发布时间】:2016-09-24 00:31:52
【问题描述】:

我有一个 .dat 文件,它在一列中有数千行(例如,列是时间,t),现在我想找到列中行之间的间隔,这意味着减去第二行的值从第一行开始,依此类推..(查找 dt)。然后我希望用这些间隔值创建一个新列,并将其绘制在原始列上。如果在这种情况下,除了 python 之外的任何其他语言有帮助,我也很感谢他们的建议。
我为此编写了一个伪 python 代码:

    import pandas as pd
import numpy as np
from sys import argv
from pylab import *


import csv



script, filename = argv


# read flash.dat to a list of lists
datContent = [i.strip().split() for i in open("./flash.dat").readlines()]

# write it as a new CSV file
with open("./flash.dat", "wb") as f:
    writer = csv.writer(f)
    writer.writerows(datContent)


columns_to_keep = ['#time']
dataframe = pd.read_csv("./flash.csv", usecols=columns_to_keep)


df = pd.DataFrame({"#time"})
df["#time"] = df["#time"]  + [pd.Timedelta(minutes=m) for m in np.random.choice(a=range(60), size=df.shape[0])]
df["value"] = np.random.normal(size=df.shape[0])

df["prev_time"] = [np.nan] + df.iloc[:-1]["#time"].tolist()
df["time_delta"] = df.time - df.prev_time
df

pd.set_option('display.height', 1000)
pd.set_option('display.max_rows', 1000)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)

dataframe.plot(x='#time', y='time_delta', style='r')

print dataframe

show()

更新了我的代码,我还分享了我正在处理的 .dat 文件。 https://www.dropbox.com/s/w4jbxmln9e83355/flash.dat?dl=0

【问题讨论】:

  • 熊猫移位功能应该可以解决问题。

标签: python mysql pandas data-manipulation


【解决方案1】:

执行涉及来自不同行的值的操作的一种简单方法是简单地将所需值复制到同一行,然后应用简单的逐行操作。

例如,在您的示例中,我们将有一个包含一个 time 列和一些其他数据的数据框,如下所示:

import pandas as pd
import numpy as np 

df = pd.DataFrame({"time":  pd.date_range("24 sept 2016",  periods=5*24, freq="1h")})
df["time"] = df["time"]  + [pd.Timedelta(minutes=m) for m in np.random.choice(a=range(60), size=df.shape[0])]
df["value"] = np.random.normal(size=df.shape[0])

如果你想计算上一行(或下一行,或其他)的时间增量,你可以简单地从中复制值,然后执行减法:

df["prev_time"] = [np.nan] + df.iloc[:-1]["time"].tolist()
df["time_delta"] = df.time - df.prev_time
df

【讨论】:

  • 我已经用你的建议更新了我的代码,但是我有一些错误,因为我的文件不包含以分钟为单位的数据等。我分享了我正在处理的原始 dat 文件,你能接受吗是时候查看它并将您的代码特定更新到我的文件中了。
  • 嗨。我查看了您的文件,据我猜测它已经包含时间增量而不是日期,可能表示为毫秒或纳秒的数量?同样的逻辑适用,一旦您将文件加载到数据框中,例如在变量df 中,您可以将列time 转换为df["time"] = df.time.apply(lambda ms: pd.Timedelta(milliseconds=ms)) 之类的东西(根据列的含义调整毫秒)。之后,我发布的代码应该可以正常工作:时间戳的差异或时间增量的差异都会产生时间增量。
猜你喜欢
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多