Подтвердить что ты не робот

Я хочу создать столбец 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
4b9b3361

Ответ 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