Python 熊猫:数一数

Python 熊猫:数一数,python,pandas,Python,Pandas,在下文中,male_trips是一个大熊猫数据帧,stations是一个小熊猫数据帧。对于每个站点id,我想知道有多少男性出行。以下操作可以完成此工作,但需要很长时间: mc = [ sum( male_trips['start_station_id'] == id ) for id in stations['id'] ] 我该怎么做呢 更新!因此主要有两种方法:groupby(),然后是size(),以及更简单的.value\u counts()。我做了一个快速的timeit,而group

在下文中,male_trips是一个大熊猫数据帧,stations是一个小熊猫数据帧。对于每个站点id,我想知道有多少男性出行。以下操作可以完成此工作,但需要很长时间:

mc = [ sum( male_trips['start_station_id'] == id ) for id in stations['id'] ]
我该怎么做呢


更新!因此主要有两种方法:
groupby()
,然后是
size()
,以及更简单的
.value\u counts()
。我做了一个快速的
timeit
,而
groupby
方法以相当大的优势获胜!代码如下:

from timeit import Timer
setup = "import pandas; male_trips=pandas.load('maletrips')"
a  = "male_trips.start_station_id.value_counts()"
b = "male_trips.groupby('start_station_id').size()"
Timer(a,setup).timeit(100)
Timer(b,setup).timeit(100)
结果如下:

In [4]: Timer(a,setup).timeit(100) # <- this is value_counts
Out[4]: 9.709594964981079

In [5]: Timer(b,setup).timeit(100) # <- this is groupby / size
Out[5]: 1.5574288368225098
[4]中的
:定时器(a,设置).timeit(100)#
不起作用?

这需要多长时间:

df = male_trips.groupby('start_station_id').sum()

编辑:在上面的答案中看到
isin
value\u counts
存在后(而且
value\u counts
甚至在
pandas.core.algorithm
中有自己的条目,而且
isin
不仅仅是
np.inad
),我更新了下面的三种方法

male_trips.start_station_id[male_trips.start_station_id.isin(station.id)].value_counts()
您还可以对stations.id执行内部联接:
pd.merge(男性行程,车站,左侧在'start'u station'id'上,右侧在'id'上)
后接
值计数
。 或:


如果您有时间的话,我会很感兴趣,这在一个巨大的数据帧中会有什么不同。

我喜欢Vishal,但不是使用sum()和size()来计算分配给每组“start\u station\u id”的行数。因此:

df = male_trips.groupby('start_station_id').size()

我下面的答案适用于0.7.3。对新版本不太确定

这就是
pandas.Series.value\u计数方法的作用:

count_series = male_trips.start_station_id.value_counts()
然后应直接根据
站['id']
中的值检查
计数(U系列
)。但是,如果您坚持只考虑这些值,您可以执行以下操作:

count_series = (
                male_trips[male_trips.start_station_id.isin(stations.id.values)]
                    .start_station_id
                    .value_counts()
               )

这将只给出在
站点中实际找到的站点id的计数。id

数据帧有多大?你有足够的记忆力吗?我看不出它在速度方面有什么问题。@myusuf3只是为了比较,我上面的方法花了一分钟多的时间(我对计数感到厌烦)而Dani下面的解决方案是用ms来衡量的。这真的令人惊讶,因为algorithms.py中有一个特定的值计数函数,我怀疑Wes会添加这个函数,如果它不比groupby和size快的话。对于我刚刚加载的数据帧,我得到了不同的结果:在[20]:timeit df.groupby(df.columns[8]).size()100个循环,在[22]:timeit df[df.columns[8]]中每个循环的最佳时间为3:13.4毫秒。value_counts()100个循环,每个循环的最佳时间为3:5.62毫秒。确保以多个顺序(a在b之前,a在b之后)多次运行计时测试。如果您只做了两次测试,那么第一次运行可能会将数据从磁盘加载到磁盘缓冲区,第二次运行可能会直接从缓冲区读取数据,从而避免磁盘访问时间..sum()将数据库中的数字列相加。不过,差一点就完成了!。count()似乎可以计算每列中所有的非空值,这很酷,只是不完全是我想要的。酷。因此,male_trips.start_station_id[male_trips.start_station_id.isin(stations.id)].value_counts()起作用,尽管可能比groupby的心跳慢。合并会抱怨“没有名为start_station_id的项目”。这种方法是我一直试图找到工作的方法之一,并且经常遇到这个问题。不太清楚这里发生了什么…重新编制索引也有抱怨,我肯定不知道这里发生了什么。错误在于:重新索引仅对唯一值的索引对象有效。顺便说一句,您刚刚向我展示了5个全新的概念。谢谢这是我的错误:“on”仅在列出现在两个数据帧中时使用(因此我的代码引用的是id和start_station_id上的连接,这在这里是错误的)。这里你必须使用“左上”和“右上”。对于重新指数:非唯一指数在大熊猫中是相当新的。这可能是不支持的。尝试df.ix[…]而不是不会引发此错误的df.reindex。您的解决方案与
male\u trips.value\u counts('start\u station\u id')相同。
count_series = male_trips.start_station_id.value_counts()
count_series = (
                male_trips[male_trips.start_station_id.isin(stations.id.values)]
                    .start_station_id
                    .value_counts()
               )