【问题标题】:Selection in Multi-Indexed DataFrame when key does not exists键不存在时多索引数据帧中的选择
【发布时间】:2014-03-25 13:45:07
【问题描述】:

我正在尝试使用多索引数据框作为字典以快速检索感兴趣的行。我正在使用 .ix[] 方法通过它的多索引选择一行,但是当键不存在时我遇到异常。有没有办法获取具有默认返回值的行?还是我必须使用 try-except 组合来完成我需要的操作?

例子:

df = DataFrame({'a':[1,2,3],'b':[1,2,3],'c':[1,2,3]})
df.set_index(['a','b'])

         c
a   b   
1   1    1
2   2    2
3   3    3

现在尝试df.ix[1,5] 时出现异常,希望获得默认值。

编辑:

这是首先提出问题的原因。我有 2 个大数据框(一个有 20,000 行,另一个有 500,000 行)。两个表中的每一行都标记了一个单词识别事件。这些列是“fileName”、“Word”、“startTime”、“endTime”。

我想要做的是找出小 df (df1) 中的哪个事件也在 df2 中出现。问题是两个表中的时间是不同的。例如:

df1

    fileName    Word    startTime   EndTime
0    file1   additional  149640  150310
1    file1   additional  316430  316900
2    file1   additional  174180  174640
3    file2   additional  161900  162460
4    file2   additional  97150   97600

和df2:

df2

    fileName    Word   startTime EndTime
0    file1   additional  149717  150406
1    file1   additional  316507  316996
2    file1   additional  174257  174736
3    file2   additional  201977  202556
4    file2   additional  97227   97696

您可以看到事件 0、1、2 和 4 是相同的事件,尽管时间略有不同。如果它们的开始和结束时间与一些小的公差相似,我认为它们是相同的。 3 事件不符合该容忍度,因此不应被视为同一事件。

我完成这项任务的方法:

  1. 按 fileName 和 Word 列索引大数据框 (df2)。
  2. 遍历 df1 的行并针对每一行:
    • 使用行 fileName 和 Word 值在 df2 中选择适当的子集
    • 遍历 df2 子集的行并查找满足时间容差的事件
    • 如果在 df2 中发现此类事件,则返回 True。否则返回假。

我很乐意研究不同的方法。

【问题讨论】:

    标签: pandas


    【解决方案1】:

    您可以使用get(尽管它仅适用于主要选择轴,例如在其列的框架中),因此您需要使用转置来访问。

    In [23]: df = DataFrame({'a':[1,2,3],'b':[1,2,3],'c':[1,2,3]})
    
    In [24]: x = df.set_index(['a','b'])
    
    In [25]: x
    Out[25]: 
         c
    a b   
    1 1  1
    2 2  2
    3 3  3
    
    [3 rows x 1 columns]
    
    In [26]: x.T.get((1,1))
    Out[26]: 
    c    1
    Name: (1, 1), dtype: int64
    
    In [27]: x.T.get((1,5),default='foo')
    Out[27]: 'foo'
    

    但是,通常迭代和选择值并不是处理框架的有效方法。你的最终目标是什么?

    【讨论】:

    • 无论如何这里有一个增强问题(能够直接指定轴):github.com/pydata/pandas/issues/6703
    • 我有 2 个大数据框及时举行事件。事件由两个属性以及开始时间和结束时间来描述。我想做的是找到类似的事件。不幸的是,两张表中的时间并不准确。可能会有一些毫秒的差异。因此,我所做的是针对一个表中的每个事件,通过两个属性在另一个表中找到一小部分相似的候选事件,然后检查时间以确定我是否有一个“足够接近”的事件。为了快速进行选择,我将属性设置为索引。
    • 然后执行此操作:df1[(df1.index>start_time_for_event)&(df1.index<end_time_for_event)](先执行 reset_index 以删除索引的非时间部分)
    • 两个df中的每一行都包含文件名、单词和发现单词的时间。我需要知道在一张表中发现的单词是否也出现在另一张表中。如前所述,时间略有不同。如果我按照您的建议按时间索引,我可能会混合使用不同的单词和不同的文件名。例如,如果在两个不同的文件中同时发现 2 个不同的单词,上面的代码将认为它们是相同的事件,但事实并非如此。因此,我首先需要通过文件名和单词属性获取目标表的子集,然后看看时间安排。
    • 听起来你需要先分组
    猜你喜欢
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2019-01-24
    • 2018-03-19
    • 2018-10-20
    • 1970-01-01
    • 2017-04-01
    相关资源
    最近更新 更多