【问题标题】:calculate difference of column values for sets of row indices which are not successive in pandas计算熊猫中不连续的行索引集的列值差异
【发布时间】:2018-05-10 15:11:11
【问题描述】:

假设我有下表:

+----+---------+--------+---------+---------+---------+---------+-----------+-----------+-----------+----------+-----------+------------+------------+---------+---+
|  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(),因为行索引可能不是连续的。 我目前正在通过循环集合来实现我的目标。

有熊猫把戏吗?

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

你需要按数据选择reindexing 然后减去:

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

lociloc 将引发未来的警告,因为将列表喜欢传递给 .loc 或 [] 并带有任何缺失的标签将在未来引发 KeyError

【讨论】:

    【解决方案2】:

    使用基于loc 的索引 -

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

    确保len(set1) 等于len(set2)。另外,请记住 setXlist 对象的反直觉名称。

    【讨论】:

    • 我会去重新索引,因为如果索引丢失,loc 和 iloc 都会引发未来的错误。
    • @Bharath 好点。虽然速度较慢(如果我没记错的话),但更安全。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • iloc aint' 在这里推荐。由于 OP 有索引。
    猜你喜欢
    • 1970-01-01
    • 2021-07-24
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2015-03-26
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多