как рассчитать, сколько раз меняется в столбце - PullRequest
0 голосов
/ 14 мая 2018

как я могу рассчитать самым простым способом, сколько значений я изменяю в определенных столбцах DataFrame.Например, я следую DF:

a b
0 1
1 1
2 1
3 2
4 1
5 2
6 2
7 3
8 3
9 3

В этом фрейме данных значения в столбце b были изменены 4 раза (в строках 4,5,6 и 8).

Мое очень простое решение:

a = 0
for i in range(df.shape[0] - 1):
   if df['b'].iloc[i] != df['b'].iloc[i+1]:
       a+=1

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Если a является столбцом, а не индексом:

 idx = df['a'].loc[df['b'].diff().shift().fillna(0) != 0]
0 голосов
/ 14 мая 2018

Я думаю, нужно boolean indexing с index:

idx = df.index[df['b'].diff().shift().fillna(0).ne(0)]
print (idx)
Int64Index([4, 5, 6, 8], dtype='int64')

Для более общего решения возможна индексация по arange:

a = np.arange(len(df))[df['b'].diff().shift().bfill().ne(0)].tolist()
print (a)
[4, 5, 6, 8]

Объяснение

Сначала получите разницу на Series.diff:

print (df['b'].diff())
0    NaN
1    0.0
2    0.0
3    1.0
4   -1.0
5    1.0
6    0.0
7    1.0
8    0.0
9    0.0
Name: b, dtype: float64

Тогда shift на одно значение:

print (df['b'].diff().shift())
0    NaN
1    NaN
2    0.0
3    0.0
4    1.0
5   -1.0
6    1.0
7    0.0
8    1.0
9    0.0
Name: b, dtype: float64

Заменить сначала NaN с на fillna:

print (df['b'].diff().shift().fillna(0))
0    0.0
1    0.0
2    0.0
3    0.0
4    1.0
5   -1.0
6    1.0
7    0.0
8    1.0
9    0.0
Name: b, dtype: float64

И сравнить не равно 0

print (df['b'].diff().shift().fillna(0).ne(0))
0    False
1    False
2    False
3    False
4     True
5     True
6     True
7    False
8     True
9    False
Name: b, dtype: bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...