Ответ 1
Мне бы понравился Vishal, но вместо использования sum() с помощью size(), чтобы получить количество строк, выделенных для каждой группы "start_station_id". Итак:
df = male_trips.groupby('start_station_id').size()
В дальнейшем, 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()
Мой ответ ниже работает в 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
.
male_trips.count()
Не работает? http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.count.html
как долго это займет:
df = male_trips.groupby('start_station_id').sum()
edit: после просмотра в ответе выше, что существуют 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.