Я хочу создать столбец value_counts в моем pandas dataframe
Я больше знаком с R, но мне хотелось посмотреть, есть ли способ сделать это в pandas. Я хочу создать счет уникальных значений из одного из моих столбцов dataframe, а затем добавить новый столбец с этими подсчетами в мой исходный фрейм данных. Я пробовал пару разных вещей. Я создал серию pandas, а затем вычислил подсчеты с помощью метода value_counts. Я попытался объединить эти значения с исходным фреймворком данных, но ключи, которые я хочу объединить, находятся в индексе (ix/loc). Любые предложения или решения будут оценены
Color Value
Red 100
Red 150
Blue 50
и я хотел вернуть что-то вроде
Color Value Counts
Red 100 2
Red 150 2
Blue 50 1
Ответы
Ответ 1
df['Counts'] = df.groupby(['Color'])['Value'].transform('count')
Например,
In [102]: df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]})
In [103]: df
Out[103]:
Color Value
0 Red 100
1 Red 150
2 Blue 50
In [104]: df['Counts'] = df.groupby(['Color'])['Value'].transform('count')
In [105]: df
Out[105]:
Color Value Counts
0 Red 100 2
1 Red 150 2
2 Blue 50 1
Обратите внимание, что transform('count')
игнорирует NaNs. Если вы хотите считать NaN, используйте transform(len)
.
В анонимный редактор: если вы получаете сообщение об ошибке при использовании transform('count')
, это может быть из-за слишком старой версии Pandas. Вышеупомянутое работает с Pandas версией 0.15 или новее.
Ответ 2
Моя первоначальная мысль заключалась в использовании понимания списка, как показано ниже, но, как было указано в комментарии, это медленнее, чем метод groupby
и transform
. Я оставлю этот ответ, чтобы продемонстрировать ЧТО НЕ ДЕЛАТЬ:
In [94]: df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]})
In [95]: df['Counts'] = [sum(df['Color'] == df['Color'][i]) for i in xrange(len(df))]
In [96]: df
Out[100]:
Color Value Counts
0 Red 100 2
1 Red 150 2
2 Blue 50 1
[3 rows x 3 columns]
Метод @unutbu усложняется для DataFrames с несколькими столбцами, которые упрощают код. Если вы работаете с небольшим фреймом данных, это происходит быстрее (см. Ниже), но в противном случае вы должны использовать НЕ.
In [97]: %timeit df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}); df['Counts'] = df.groupby(['Color']).transform('count')
100 loops, best of 3: 2.87 ms per loop
In [98]: %timeit df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}); df['Counts'] = [sum(df['Color'] == df['Color'][i]) for i in xrange(len(df))]
1000 loops, best of 3: 1.03 ms per loop