首页 > 解决方案 > 如何计算列中更改了多少次

问题描述

我如何以最简单的方式计算,我在特定 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

标签: pandas

解决方案


我认为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

将第一个NaNs替换为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

推荐阅读