以下では、male_trips は大きな pandas データ フレームで、stations は小さな pandas データ フレームです。各ステーション ID について、男性の旅行が何回行われたか知りたいと思います。次のコードで目的を達成できますが、時間がかかります。
mc = [ sum( male_trips['start_station_id'] == id ) for id in stations['id'] ]
代わりにどうすればいいでしょうか?
更新! 主なアプローチは 2 つありました。 、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 はわずかに高速で、記憶する必要も少なくなります。
ベストアンサー1
私は Vishal と同じように、sum() を使用する代わりに size() を使用して、'start_station_id' の各グループに割り当てられた行の数を取得します。つまり、次のようになります。
df = male_trips.groupby('start_station_id').size()