熊猫:算一下

Mik*_*war 32 python pandas

在下文中,male_trips是一个大熊猫数据帧,而站是一个小熊猫数据帧.对于每个电台,我想知道有多少次男性旅行.以下工作,但需要很长时间:

mc = [ sum( male_trips['start_station_id'] == id ) for id in stations['id'] ]
Run Code Online (Sandbox Code Playgroud)

我应该怎么做呢?


更新!因此有两种主要方法: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)
Run Code Online (Sandbox Code Playgroud)

这是结果:

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
Run Code Online (Sandbox Code Playgroud)

请注意,在此速度下,为了探索数据输入, value_counts会更快,更少记忆!

Dan*_*Bel 50

我喜欢Vishal,但不使用sum()使用size()来获取分配给每组'start_station_id'的行数.所以:

df = male_trips.groupby('start_station_id').size()
Run Code Online (Sandbox Code Playgroud)


ely*_*ely 20

我在下面的答案适用于Pandas 0.7.3.不确定新版本.

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

count_series = male_trips.start_station_id.value_counts()
Run Code Online (Sandbox Code Playgroud)

应该直截了当地count_series根据中的值进行检查stations['id'].但是,如果您坚持考虑这些值,则可以执行以下操作:

count_series = (
                male_trips[male_trips.start_station_id.isin(stations.id.values)]
                    .start_station_id
                    .value_counts()
               )
Run Code Online (Sandbox Code Playgroud)

这只会给出实际找到的电台ID的计数stations.id.