1

我有一个带有“时间”和“A”列的熊猫数据框。对于每一行,df["Time"] 是一个整数时间戳,df["A"] 是一个浮点数。我想创建一个新列“B”,其值为 df[“A”],但该列发生在未来五秒或之前五秒。我可以迭代地这样做:

for i in df.index:
    df["B"][i] = df["A"][max(df[df["Time"] <= df["Time"][i]+5].index)]

但是,df 有数万条记录,所以这需要很长时间,而且我需要运行几百次,所以我的解决方案并不是一个真正的选择。我对 pandas 有点陌生(对一般编程来说只是不太新),所以我不确定 pandas 是否有明显的解决方案。

如果我有一种方法可以在创建列时引用每行中 df["Time"] 的特定值,那将有所帮助,因此我可以执行以下操作:

df["B"] = df["A"][max(df[df["Time"] <= df["Time"][corresponding_row]+5].index)]

谢谢。

编辑:这是我的目标的一个例子。如果数据框如下:

Time A
0    0
1    1
4    2
7    3
8    4
10   5
12   6
15   7
18   8
20   9

那么我希望结果是:

Time A  B
0    0  2
1    1  2
4    2  4
7    3  6
8    4  6
10   5  7
12   6  7
15   7  9
18   8  9
20   9  9

其中 B 中的每一行都来自 Time 最多为 5 的行中 A 的值。因此,如果 Time 也是索引,则 df["B"][0] = df["A"][4 ] 因为 4 是最大时间,最多 5 大于 0。在代码中,4 = max(df["Time"][df["Time"] <= 0+5],这就是为什么 df["B "][0] 是 df["A"][4]。

4

1 回答 1

0

使用tshift。您可能需要先重新采样以填充任何缺失值。我没有时间测试这个,但试试这个。

df['B'] = df.resample('s', how='ffill').tshift(5, freq='s').reindex_like(df)

在这里获得帮助的提示:如果您提供几行示例数据和所需结果的示例,我们很容易复制/粘贴并为您尝试解决方案。

编辑

好的,看看您的示例数据,让我们将您的时间列保留为整数。

In [59]: df
Out[59]: 
      A
Time   
0     0
1     1
4     2
7     3
8     4
10    5
12    6
15    7
18    8
20    9

制作一个包含第一个和最后一个 Time 值以及介于两者之间的所有整数的数组。

In [60]: index = np.arange(df.index.values.min(), df.index.values.max() + 1)

制作一个新的 DataFrame 并填充所有空白。

In [61]: df1 = df.reindex(index, method='ffill')

创建一个新列,将相同的数据向上移动 5 - 即,将时间向前移动 5 秒。

In [62]: df1['B'] = df1.shift(-5)

现在删除我们添加的所有填充时间,仅从原始时间索引中获取值。

In [63]: df1.reindex(df.index)
Out[63]: 
      A   B
Time       
0     0   2
1     1   2
4     2   4
7     3   6
8     4   6
10    5   7
12    6   7
15    7   9
18    8 NaN
20    9 NaN

如何填写最后一个值,没有“五秒后”取决于您。从您想要的输出来看,可能使用fillna设置为 A 列中最后一个值的常量值。

于 2013-09-03T16:00:15.317 回答