当密钥不存在时,在多索引DataFrame中进行选择

时间:2014-03-25 13:45:08

标签: pandas

我尝试使用多索引数据框作为字典以快速方式检索感兴趣的行。我使用.ix []方法通过它的多索引选择一行,但是当密钥不存在时遇到异常。有没有办法获得带有defualt返回值的行?或者我必须使用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"。

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

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。否则返回false。
  3. 我会愉快地研究不同的方法。

1 个答案:

答案 0 :(得分:2)

您可以使用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'

然而,通常迭代和选择值不是使用帧做事的有效方法。你的最终目标是什么?