Панды: Как получить количество строк по значению определенного значения столбца и добавить счет в качестве другого столбца.

1

Скажем, что мои данные выглядят так: все данные сортируются по значению в столбце b

a   b
1   32
4   32
5   32
9   45
8   45
3   76
5   76
7   76
9   76

Каким будет наиболее эффективный способ иметь первую строку, содержащую конкретное значение столбца, общее количество раз, которое имеет значение конкретного столбца. Для остальных строк с тем же значением столбца я хочу, чтобы они были другим значением (строка, -1, nan и т.д., Но не положительное целое число). В приведенном ниже примере я использую "-1" как другое значение

a   b   count b
1   32  3
4   32  -1
5   32  -1
9   45  2
8   45  -1
3   76  4
5   76  -1
7   76  -1
9   76  -1

Таким образом, в приведенной выше таблице первая строка, где столбец b равна 32, будет иметь значение "Count b" 3, а затем остальные строки, где столбец 32, будут иметь значение "Count b" -1.

Теги:
pandas

3 ответа

2
Лучший ответ

Начните с вычисления длины пролета:

df = df.merge(df.groupby('b').size().reset_index())
#   a   b  0
#0  1  32  3
#1  4  32  3
#2  5  32  3
#3  9  45  2
#4  8  45  2
#5  3  76  4
#6  5  76  4
#7  7  76  4
#8  9  76  4

Замените повторяющиеся длины в каждом диапазоне с помощью -1:

df.loc[df.duplicated(subset=['b',0]), 0] = -1

#   a   b  0
#0  1  32  3
#1  4  32 -1
#2  5  32 -1
#3  9  45  2
#4  8  45 -1
#5  3  76  4
#6  5  76 -1
#7  7  76 -1
#8  9  76 -1
2

Использование groupby.count + pd.Series.duplicated:

df['count_b'] = df.groupby('b').transform('count')
df.loc[df['b'].duplicated(), 'count_b'] = -1

print(df)

   a   b  count_b
0  1  32        3
1  4  32       -1
2  5  32       -1
3  9  45        2
4  8  45       -1
5  3  76        4
6  5  76       -1
7  7  76       -1
8  9  76       -1

Вы можете, если хотите, объединить два шага с numpy.where:

import numpy as np

df['count_b'] = np.where(df['b'].duplicated(), -1,
                         df.groupby('b')['b'].transform(len))
1

Использование value_count с fillna

df['New']=df.b.drop_duplicates().map(df.b.value_counts())
df.New.fillna(-1,inplace=True)
df.New=df.New.astype(int)
df
Out[197]: 
   a   b  New
0  1  32    3
1  4  32   -1
2  5  32   -1
3  9  45    2
4  8  45   -1
5  3  76    4
6  5  76   -1
7  7  76   -1
8  9  76   -1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню