计算pandas中不连续的行索引集的列值差异

时间:2017-11-27 11:29:04

标签: python pandas dataframe

说我有下表:

+----+---------+--------+---------+---------+---------+---------+-----------+-----------+-----------+----------+-----------+------------+------------+---------+---+
|  1 | 0.72694 | 1.4742 | 0.32396 | 0.98535 |       1 | 0.83592 | 0.0046566 | 0.0039465 |   0.04779 |  0.12795 |  0.016108 |  0.0052323 | 0.00027477 |  1.1756 | 1 |
|  2 | 0.74173 | 1.5257 | 0.36116 | 0.98152 | 0.99825 | 0.79867 | 0.0052423 | 0.0050016 |   0.02416 | 0.090476 | 0.0081195 |   0.002708 | 7.48E-05   | 0.69659 | 1 |
|  3 | 0.76722 | 1.5725 | 0.38998 | 0.97755 |       1 | 0.80812 | 0.0074573 |  0.010121 |  0.011897 | 0.057445 | 0.0032891 | 0.00092068 | 3.79E-05   | 0.44348 | 1 |
|  4 | 0.73797 | 1.4597 | 0.35376 | 0.97566 |       1 | 0.81697 | 0.0068768 | 0.0086068 |   0.01595 | 0.065491 | 0.0042707 |  0.0011544 | 6.63E-05   | 0.58785 | 1 |
|  5 | 0.82301 | 1.7707 | 0.44462 | 0.97698 |       1 | 0.75493 |  0.007428 |  0.010042 | 0.0079379 | 0.045339 | 0.0020514 | 0.00055986 | 2.35E-05   | 0.34214 | 1 |
|  7 | 0.82063 | 1.7529 | 0.44458 | 0.97964 | 0.99649 |  0.7677 | 0.0059279 | 0.0063954 |  0.018375 | 0.080587 | 0.0064523 |  0.0022713 | 4.15E-05   | 0.53904 | 1 |
|  8 | 0.77982 | 1.6215 | 0.39222 | 0.98512 | 0.99825 | 0.80816 | 0.0050987 | 0.0047314 |  0.024875 | 0.089686 | 0.0079794 |  0.0024664 | 0.00014676 | 0.66975 | 1 |
|  9 | 0.83089 | 1.8199 | 0.45693 |  0.9824 |       1 | 0.77106 | 0.0060055 |  0.006564 | 0.0072447 | 0.040616 | 0.0016469 | 0.00038812 | 3.29E-05   | 0.33696 | 1 |
| 11 |  0.7459 | 1.4927 | 0.34116 | 0.98296 |       1 | 0.83088 | 0.0055665 | 0.0056395 | 0.0057679 | 0.036511 | 0.0013313 | 0.00030872 | 3.18E-05   | 0.25026 | 1 |
| 12 | 0.79606 | 1.6934 | 0.43387 | 0.98181 |       1 | 0.76985 | 0.0077992 |  0.011071 |  0.013677 | 0.057832 | 0.0033334 | 0.00081648 | 0.00013855 | 0.49751 | 1 |
+----+---------+--------+---------+---------+---------+---------+-----------+-----------+-----------+----------+-----------+------------+------------+---------+---+

我有两组行索引:

set1 = [1,3,5,8,9]

set2 = [2,4,7,10,10]

注意:这里,我已指出第一行的索引值为1.两组的长度应始终相同。

我正在寻找的是一种快速和pythonic的方法来获得相应行索引的列值的差异,即:1-2,3-4,5-7,8-10,9-10的差异

对于此示例,我的结果数据帧如下:

+---+---------+--------+---------+---------+---------+---------+-----------+-----------+-----------+----------+-----------+------------+------------+---------+---+
| 1 | 0.01479 | 0.0515 |  0.0372 | 0.00383 | 0.00175 | 0.03725 | 0.0005857 | 0.0010551 |   0.02363 | 0.037474 | 0.0079885 |  0.0025243 | 0.00019997 | 0.47901 | 0 |
| 1 | 0.02925 | 0.1128 | 0.03622 | 0.00189 |       0 | 0.00885 | 0.0005805 | 0.0015142 |  0.004053 | 0.008046 | 0.0009816 | 0.00023372 |  0.0000284 | 0.14437 | 0 |
| 3 | 0.04319 | 0.1492 |  0.0524 | 0.00814 | 0.00175 | 0.05323 | 0.0023293 | 0.0053106 | 0.0169371 | 0.044347 |  0.005928 | 0.00190654 | 0.00012326 | 0.32761 | 0 |
| 3 | 0.03483 | 0.1265 | 0.02306 | 0.00059 |       0 | 0.00121 | 0.0017937 |  0.004507 | 0.0064323 | 0.017216 | 0.0016865 | 0.00042836 | 0.00010565 | 0.16055 | 0 |
| 1 | 0.05016 | 0.2007 | 0.09271 | 0.00115 |       0 | 0.06103 | 0.0022327 | 0.0054315 | 0.0079091 | 0.021321 | 0.0020021 | 0.00050776 | 0.00010675 | 0.24725 | 0 |
+---+---------+--------+---------+---------+---------+---------+-----------+-----------+-----------+----------+-----------+------------+------------+---------+---+

我的结果差值在这里是绝对的。

我不能应用diff(),因为行索引可能不是连续的。 我目前正在通过循环来实现我的目标。

有没有熊猫的伎俩呢?

2 个答案:

答案 0 :(得分:2)

您需要按数据reindex选择然后减去:

df =  df.reindex(set1) - df.reindex(set2).values

lociloc会引发未来警告,因为将列表喜欢传递给.loc或[]以及任何缺少的标签将来会引发KeyError

答案 1 :(得分:0)

简而言之,请尝试以下方法:

df.iloc[::2].values - df.iloc[1::2].values

PS: 或者,如果(在您的问题中,索引遵循没有简单的规则):

df.iloc[set1].values - df.iloc[set2].values