【问题标题】:Select rows from Dataframe with variable number of conditions从具有可变数量条件的数据框中选择行
【发布时间】:2020-11-21 16:41:53
【问题描述】:

我正在尝试编写一个函数,该函数将带有“时间戳”列和元组列表的 DataFrame 作为输入。每个元组都将包含一个开始和结束时间。

我想要做的是将数据帧“拆分”为两个新的数据帧,其中第一个包含时间戳值不包含在任何元组的极端之间的行,另一个只是补充。 过滤器元组的数量是未知的。

df = DataFrame({'timestamp':[0,1,2,5,6,7,11,22,33,100], 'x':[1,2,3,4,5,6,7,8,9,1])
filt = [(1,4), (10,40)]
left, removed = func(df, filt)

这应该给我两个数据框

  • :带有时间戳[0,5,6,7,100]的行
  • 已删除:带有时间戳[1,2,11,22,33] 的行

我相信正确的方法是编写一个可用作过滤器的自定义函数,然后调用以某种方式过滤/屏蔽数据帧,但我找不到如何实现这一点的合适示例。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    检查

    out = df[~pd.concat([df.timestamp.between(*x) for x in filt]).any(level=0)]
    Out[175]: 
       timestamp  x
    0          0  1
    3          5  4
    4          6  5
    5          7  6
    9        100  1
    

    【讨论】:

    • 我猜它有效,谢谢。我不确定 concat 在处理许多值和条件时是否非常有效,对吧?
    • @AndreaRonco 是的
    【解决方案2】:

    你不能对.isin()使用过滤:

    left,removed = df[df['timestamp'].isin([0,5,6,7,100])],df[df['timestamp'].isin([1,2,11,22,33])]
    

    【讨论】:

    • 不,它需要随着可变数量的过滤器元组进行缩放
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多