Pandas:数数

2024-04-27 12:24:38 发布

您现在位置:Python中文网/ 问答频道 /正文

在下文中,雄熊猫旅行是一个大熊猫数据框架,而站点是一个小熊猫数据框架。我想知道每个车站都有多少男性乘客。以下操作完成任务,但需要很长时间:

mc = [ sum( male_trips['start_station_id'] == id ) for id in stations['id'] ]

我该怎么做呢?


更新!所以主要有两种方法:groupby()然后是size(),以及更简单的.value_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

注意,在这种速度下,对于探索数据而言,输入“eem”值计数要快得多,记住的也少得多!


Tags: 数据方法框架idsizevaluesetupstart
3条回答

我喜欢Vishal,但不想使用sum()using size()来获取分配给每组“start_station_I d”的行数。所以:

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

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

这就是pandas.Series.value_counts方法的用途:

count_series = male_trips.start_station_id.value_counts()

然后根据stations['id']中的值直接检查count_series。但是,如果您坚持只考虑这些值,您可以执行以下操作:

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

这只会给出在stations.id中实际找到的站点ID的计数。

相关问题 更多 >