我有一个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有更好的方法吗?
答案 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..