计算pandas.loc搜索的结果数

时间:2014-09-15 03:22:57

标签: python pandas

我有一个带有两列的pandas DataFrame" user" (用户ID)和" TS" (时间戳)。

>>> print rawData
<class 'pandas.core.frame.DataFrame'>
Int64Index: 74883 entries, 0 to 74882
Data columns (total 2 columns):
TS      74883  non-null values
user    74883  non-null values
dtypes: float64(1), object(1)

我确保数据框已在&#39;用户&#39;上编入索引。字段。

>>> indexedDataFrame = rawData.set_index('user')

现在我可以获取用户的时间戳列表。

>>> indexedDataFrame.loc['user1','TS']
user
user1   1423217959.064690
user1   1423217959.204906
user1   1423217959.324809
...
user1   1423220404.366348
user1   1423221013.064749
Name: TS, Length: 3151, dtype: float64

这允许我通过计算来查找此用户的条目数 数组中的条目数。

>>> indexedDataFrame.loc['user1', 'TS'].count()
3151

到目前为止一切顺利。当只有一个条目时,会出现问题 用户。在这种情况下,大熊猫,大概是为了让用户更容易,返回 直接输入而不是具有一个值的数组。不幸的是,这意味着计数操作 失败,因为你不能在浮点数上调用count()。

>>> indexedDataFrame.loc['user15', 'TS']
1423217968.5711029

>>> indexedDataFrame.loc['user15', 'TS'].count()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-259-8712c5fa66de> in <module>()
----> 1 indexedDataFrame.loc['user15', 'TS'].count()

AttributeError: 'numpy.float64' object has no attribute 'count'

所以这意味着如果我想编写一个计算数量的函数 每个用户的时间戳,我必须执行以下操作:

def findEventCounts():
    userCountMap = {}
    for user in distinctUsers:
        print "Counting entries for user %s" % user
        searchResult = indexedDataFrame.loc[user, 'TS']
        try:
            userCount = searchResult.count()
        except AttributeError:
            userCount = 1
        print user, userCount
        userCountMap[user] = userCount
    return userCountMap

这是愚蠢和丑陋的。

不幸的是,这种返回值的行为而不是带有数组的数组 单个条目实际上也出现在熊猫文档中,所以我是 非常确定这是预期的行为。

(参见http://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label中的最后一个例子,

# this is also equivalent to ``df1.at['a','A']``
In [44]: df1.loc['a','A']
Out[44]: -1.7769037169718671

是否有解决方法,或者我是否真的必须编写如上所述的丑陋代码 用熊猫?如果是后者,我不会使用熊猫......:)

1 个答案:

答案 0 :(得分:2)

您可以传递一个元素列表作为索引,以强制它返回一个系列,即使只有一个匹配:

indexedDataFrame.loc[['user1'], 'TS']

(您还可以使用多元素列表一次获取多个索引,例如indexedDataFrame.loc[['user1', 'user2'], 'TS']以获取两个用户的所有行。)