熊猫:算一下

时间:2012-10-12 21:12:34

标签: python pandas

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

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

我应该怎么做呢?


更新!因此,有两种主要方法:groupby()后跟size(),更简单.value_counts()。我快速timeitgroupby方法获得了相当大的收益!这是代码:

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

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

5 个答案:

答案 0 :(得分:48)

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

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

答案 1 :(得分:19)

我的答案适用于Pandas 0.7.3。不确定新版本。

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

count_series = male_trips.start_station_id.value_counts()

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

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

这只会计算stations.id中实际找到的电台ID的计数。

答案 2 :(得分:3)

答案 3 :(得分:2)

这需要多长时间:

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

答案 4 :(得分:2)

编辑:在上面的答案中看到isinvalue_counts存在(并且value_counts甚至在pandas.core.algorithmisin中都有自己的条目不仅仅是np.in1d)我更新了以下三种方法

male_trips.start_station_id[male_trips.start_station_id.isin(station.id)].value_counts()

您还可以在stations.id上进行内部联接: pd.merge(male_trips, station, left_on='start_station_id', right_on='id')后跟value_counts。 或者:

male_trips.set_index('start_station_id, inplace=True)
station.set_index('id, inplace=True)
male_trips.ix[male_trips.index.intersection(station.index)].reset_index().start_station_id.value_counts()

如果您有时间我感兴趣的是,这对于巨大的DataFrame有何不同的表现。