我有一个带有“时间”和“A”列的pandas DataFrame。对于每一行,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中的每一行来自行中A的值,其中Time大于5。因此,如果Time也是索引,那么df [“B”] [0] = df [“A” ] [4]因为4是最大的时间,最多5个大于0.在代码中,4 = max(df [“Time”] [df [“Time”]&lt; = 0 + 5],这就是为什么df [“B”] [0]是df [“A”] [4]。
答案 0 :(得分: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列中的最后一个值。