我如何以最简单的方式计算我在特定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
答案 0 :(得分:1)
我认为需要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
并且比较不等于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]