32

下面,male_trips 是大熊猫数据框,站是小熊猫数据框。对于每个车站 ID,我想知道发生了多少次男性旅行。以下内容可以完成这项工作,但需要很长时间:

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

请注意,在这种速度下,探索数据类型value_counts 会稍微快一些,而且记忆力更小!

4

5 回答 5

50

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

df = male_trips.groupby('start_station_id').size()
于 2012-10-13T14:29:37.487 回答
21

我在下面的答案适用于 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.

于 2012-10-13T14:39:56.103 回答
3
male_trips.count()

不工作? http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.count.html

于 2012-10-12T21:29:18.717 回答
3

这需要多长时间:

df = male_trips.groupby('start_station_id').sum()
于 2012-10-12T22:00:59.020 回答
2

编辑:在上面的答案中看到isin并且value_counts存在(value_counts甚至带有自己的条目pandas.core.algorithm并且isin也不简单np.in1d)之后,我更新了以下三种方法

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

您还可以在 station.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 的表现有何不同感兴趣。

于 2012-10-13T10:05:26.750 回答