Python Pandas依赖于值的列创建

时间:2013-09-03 15:31:21

标签: python pandas

我有一个带有“时间”和“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]。

1 个答案:

答案 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列中的最后一个值。