Скажем, что мои данные выглядят так: все данные сортируются по значению в столбце 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.
Начните с вычисления длины пролета:
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
Использование 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))
Использование 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