熊猫复杂过滤

时间:2015-01-15 21:36:39

标签: python pandas

我有一个pandas.DataFrame()对象,如下所示

start, end
    5, 9
    6, 11
    13, 11
    14, 11
    15, 17
    16, 17
    18, 17
    19, 17
    20, 24
    22, 26

“结束”必须始终是> “开始” 所以,我需要从“结束”值变为< “开始”直到下一行再次恢复正常。

在上面的例子中,我需要:

1

13,11
15,17

2

18,17
20,24

编辑:(已更新) 将这些视为时间戳,以秒为单位。所以我发现两种情况都需要2秒才能恢复。

我可以在迭代数据时这样做,但Pandas有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用熊猫boolean indexing查找start < end行。然后,如果您reset the index,您可以计算原始索引之间的差异,这些索引充当start > end行之间的上限和下限delta。

例如,您可以执行以下操作:

# A = starts, B = ends
df = pd.DataFrame({'B' : [9, 11, 11, 11, 17, 17, 17, 17, 24, 26],
                   'A': [5, 6, 13, 14, 15, 16, 18, 19, 20, 22]})

# use boolean indexing
df = df[df['A'] < df['B']].reset_index()

# calculate the difference of each row's "old" index to determine delta
diffs = df['index'].diff()

# create a column to show deltas
df['delta'] = diffs

print(diffs)
print(df)

diffs数据框如下所示:

0   NaN
1     1
2     3
3     1
4     3
5     1
Name: index, dtype: float64

请注意NaN值,因为diff()方法会从当前行中减去上一行,但由于第一行没有前一行,因此会标记NaN。在index的第一个任意数字为n starts的情况下,必须只查看> ends列的第一个值来计算增量。

完全增强的数据框将如下所示:

   index   A   B  delta
0      0   5   9    NaN
1      1   6  11      1
2      4  15  17      3
3      5  16  17      1
4      8  20  24      3
5      9  22  26      1

如果您想删除任何无关的列,可以使用del方法,如下所示:

del col1, col2, col3, etc..