我有一个带有两列的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
)
是否有解决方法,或者我是否真的必须编写如上所述的丑陋代码 用熊猫?如果是后者,我不会使用熊猫......:)
答案 0 :(得分:2)
您可以传递一个元素列表作为索引,以强制它返回一个系列,即使只有一个匹配:
indexedDataFrame.loc[['user1'], 'TS']
(您还可以使用多元素列表一次获取多个索引,例如indexedDataFrame.loc[['user1', 'user2'], 'TS']
以获取两个用户的所有行。)