如何计算列中更改的次数

时间:2018-05-14 08:33:44

标签: pandas

我如何以最简单的方式计算我在特定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 :(得分:1)

我认为需要boolean indexingindex

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

fillna替换为markdown

NaN

并且比较不等于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

答案 1 :(得分:0)

如果a是一列而不是索引:

 idx = df['a'].loc[df['b'].diff().shift().fillna(0) != 0]
相关问题