使用pandas在一列数字中查找数据更改

时间:2015-11-02 10:41:16

标签: python pandas ipython-notebook

我有一个大型csv表,其数据如下:

Loop_3_OP   Loop_3_PV   Line1_Cleaning  Line2_Cleaning  time            date
59.17       29.63       0               0               18:00:33.239000 2015-11-01
59.17       29.63       0               0               18:00:34.231000 2015-11-01

在整个表格中,Line1_Cleaning和Line2_Cleaning在0和1之间变化,如:

59.17       29.63       0              0                 18:06:22.343000    2015-11-01
59.17       29.63       1              0                 18:06:34.565000    2015-11-01
59.17       29.63       1              0                 18:06:34.565000    2015-11-01
59.17       29.63       1              0                 18:06:35.918000    2015-11-01
59.17       29.63       1              0                 18:06:35.918000    2015-11-01
59.17       29.63       0              0                 18:06:35.929000    2015-11-01

我希望能够在发生转换时只拾取行,例如:

59.17       29.63       1              0                 18:06:34.565000    2015-11-01 

我可以在迭代行的传统python中做到这一点:

read = csv.reader(ifile)
for row in read :
   val= row[2]
   if val>lastval:
        print val, row[4],"L1 Start Clean"
   lastval=val

我想知道是否有人可以提供如果它可以在熊猫中完成。我正在使用Anaconda和iPython,并希望 看看是否可能。

此致

4 个答案:

答案 0 :(得分:1)

IIUC你可以使用diff

In [16]:
df[df['Line1_Cleaning'].diff() > 0]

Out[16]:
   Loop_3_OP  Loop_3_PV  Line1_Cleaning  Line2_Cleaning             time  \
3      59.17      29.63               1               0  18:06:34.565000   

        date  
3 2015-11-01  

因此,这会调用diff相对于前一行减去行,并过滤它们的差异>0

diff的输出:

In [17]:
df['Line1_Cleaning'].diff()

Out[17]:
0   NaN
1     0
2     0
3     1
4     0
5     0
6     0
7    -1
Name: Line1_Cleaning, dtype: float64

答案 1 :(得分:1)

我认为您正在寻找当前Line1_Cleaning大于previous line Line1_Cleaning的值,然后提取提取线。这只是Line1_Cleaning的{​​{1}}更改。

0 to 1

答案 2 :(得分:0)

numpy.diff在这里可能很有用:计算每列的差异,以及diff!= 0,你会找到行索引。您可以使用布尔值组合两列的差异,并且不要忘记将索引偏移1。

类似的东西:

diff1 = np.diff(table['Line1_Cleaning'])
diff2 = np.diff(...

diff = (diff1 != 0) | (diff2 != 0)
indices = np.arange(len(diff))[diff] + 1
changing_rows = table.ix[indices]

(完全未经测试。)

<小时/> (也许Pandas中也有diff函数/方法,但我对numpy更熟悉。)

答案 3 :(得分:0)

如果我理解正确,您希望在#for reading from cache gnav_cache_data = Rails.cache.read(cache_key) #to write in cache Rails.cache.fetch(cache_key, :expires_in => 15.minutes) do gnav_data_response end 值为Line1_Cleaning时选择行。如果是这样,你可以这样做:

1