【问题标题】:Interpret range from dataframe column based on group ranges from another dataframe根据来自另一个数据框的组范围解释来自数据框列的范围
【发布时间】:2019-03-22 16:57:17
【问题描述】:

最近我在使用 R 时遇到了类似的问题,现在我想在 python 2.7 中使用 pandas 来解决这个问题。我已经在这里查看了几个类似的问题,但是仍然有问题。

我有两个数据框:

import pandas as pd

dfa = pd.DataFrame([["1", "1", "2", "A"], ["2", "1", "2", "A"], ["3", "3", 
    "4", "B"], ["4", "3", "4", "B"], ["5", "5", "6", "C"], ["6", "5", "6", 
    "C"], ["7", "7", "8", "D"], ["8", "7", "8", "D"]], columns=['TimeStamp', 
    'Min', 'Max', 'Group'])
dfb = pd.DataFrame([['1'], ['2'], ['3'], ['4'], ['5'], ['6'], ['7'], ['8']], 
    columns = ['TimeStamp'])

我正在寻找一种方法,根据时间戳在 dfb 中创建组 id,该时间戳在 dfa 中每个组的 min-max 范围内。所以,dfb_final:

这适用于更大的数据集,我已经简化了示例。我只是不确定下一步该做什么。根据其他答案,我得到了 dfa 中的 min max 列。非常感谢向大家学习。

【问题讨论】:

    标签: python python-2.7 pandas dataframe


    【解决方案1】:

    您可以使用np.searchsorted。下面的解决方案假定组间Min / Max没有重叠。首先将一些系列转换为数字,以便它们可以通过 NumPy 使用:

    dfa[dfa.columns[:-1]] = dfa[dfa.columns[:-1]].apply(pd.to_numeric)
    dfb['TimeStamp'] = pd.to_numeric(dfb['TimeStamp'])
    

    注意datetime / 时间戳值可以在必要时转换为等效数字。

    然后提取唯一组和Min / Max 值的扁平化版本:

    groups = dfa['Group'].unique()
    vals = dfa.drop_duplicates('Group').loc[:, ['Min', 'Max']].values.ravel()
    

    最后,使用np.searchsorted 定位vals 中的时间戳,并使用结果索引groups

    dfb['Group'] = groups[np.searchsorted(dfb['TimeStamp'].values, vals) // 2]
    
    print(dfb)
    
       TimeStamp Group
    0          1     A
    1          2     A
    2          3     B
    3          4     B
    4          5     C
    5          6     C
    6          7     D
    7          8     D
    

    【讨论】:

    • 您好 jpp,非常感谢您帮助我。我正在我的实际数据集上尝试您的代码,并且收到“IndexError:索引 573 超出轴 1 大小为 4 的范围”。我正在查看 np.searchsorted 文档,但内容不多。我的 dfb 数据集的时间戳比 dfa 中的时间戳长得多,我不确定这是否是导致此错误的原因?我会继续修修补补,但如果你有任何建议会很棒 jpp-谢谢你到目前为止的帮助
    猜你喜欢
    • 2019-03-06
    • 1970-01-01
    • 2021-06-22
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多