在下文中,male_trips是一个大熊猫数据帧,而站点是一个小熊猫数据帧。对于每个电台,我想知道有多少次男性旅行。以下工作,但需要很长时间:
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会更快,更少记忆!
答案 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)
male_trips.count()
不起作用? http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.count.html
答案 3 :(得分:2)
这需要多长时间:
df = male_trips.groupby('start_station_id').sum()
答案 4 :(得分: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()
您还可以在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有何不同的表现。