如何通过同一数据框中的其他行过滤pandas数据框?

时间:2016-05-24 20:56:26

标签: python sql pandas

两个熊猫问题:

  1. 如何在不将该列添加到数据框中的情况下加入已修改的列?

  2. 你怎么做相当于“左边加入ZZ ...... ZZ.ID为空”

  3. 我在下面有一个示例,它在SQL中具有这两个功能。

    让我说我翻了一下硬币100次,注意它是哪一个翻盖。每次它落在HEADS上时,我都会在一个带有“flipNumber”的名为“coin_flips”的表格中添加一行。 该表看起来像这样

    flipNumber
    4
    5
    7
    12
    13
    14
    16
    

    我想拉出计数间隙之前出现的每个“flipNumber”。从上面的例子中,我想拉5,7,14,16。使用SQL,我可以这样拉:

    select
       v1.flipNumber
    from
     coin_flips v1
    left join
     coin_flips v2
     on v2.flipNumber = v1.flipNumber +1
    where
     v2.flipNumber is null
    

    我如何在熊猫中做同样的事情?

    我发现的一个解决方案是使用 pandasql ,它允许你编写针对数据帧的sql查询,但我想知道如何本地执行。

1 个答案:

答案 0 :(得分:0)

设置

s = pd.Series([4, 5, 7, 12, 13, 14, 16], name='flipNumber')

解决方案

s[(s.shift(-1) - s) > 1]

解释

使用

获取一个数字与下一个数字的差异
s.shift(-1) - s

检查它是否大于1.这标识了一个差距

(s.shift(-1) - s) > 1

将此作为原始系列的面具

s[(s.shift(-1) - s) > 1]

这能够得到你所说的你之前真正的差距之前的第一个数字。使用您的示例,我们最终应该使用[5, 7, 14]。 16不是也不应该包括在内,因为你不知道是否会有后续的差距。如果你坚持要包括最后一点,我们可以修改它以包含但你必须指定一个规则来执行它。

pandas有加入,合并,连接等等,但这些都不是完成这项任务所必需的。

在我提供的代码中,(s.shift(-1) - s) > 1与sql代码on v2.flipNumber = v1.flipNumber +1

完全相反