32

次の 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 と入力するデータ探索のほうがわずかに速く、覚える必要がないことに注意してください。

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

以下の私の答えはパンダ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()
               )

これにより、で実際に見つかったステーションIDのカウントのみが得られ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

編集:上記の回答を見てisinvalue_counts存在する(value_countsさらに、独自のエントリが含まれてpandas.core.algorithmおり、isin単純ではないnp.in1d)以下の3つの方法を更新しました

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

pd.merge(male_trips, station, left_on='start_station_id', right_on='id')また、 stations.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 に答える