Pandas: считать вещи

В дальнейшем, male_trips - это большой кадр данных pandas, а станции - небольшой кадр данных pandas. Для каждого идентификатора станции я хотел бы узнать, сколько мужских поездок произошло. Следующее выполняет эту работу, но занимает много времени:

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

как я могу это сделать?


Update! Таким образом, существовали два основных подхода: 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

Обратите внимание, что на этой скорости для изучения ввода данных значение_значений происходит немного быстрее и менее запоминается!

Мне бы понравился Vishal, но вместо использования sum() с помощью size(), чтобы получить количество строк, выделенных для каждой группы "start_station_id". Итак:

df = male_trips.groupby('start_station_id').size()
47
ответ дан 13 окт. '12 в 17:29
источник

Мой ответ ниже работает в 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.

18
ответ дан 13 окт. '12 в 17:39
источник

edit: после просмотра в ответе выше, что существуют isin и value_countsvalue_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.

2
ответ дан 13 окт. '12 в 13:05
источник