2017-07-11 13 views
1

パンダのデータフレーム内の各列の値の変化の数を数える方法はありますか?パンダのデータフレームの各列の値の変化をカウントする

私は自分自身が、各列の上にループを持っている必要はありません、例えば:

import pandas as pd 

frame = pd.DataFrame({ 
    'time':[1234567000,1234567005,1234567009], 
    'X1':[96.32,96.01,96.05], 
    'X2':[23.88,23.96,23.96] 
},columns=['time','X1','X2']) 

print(frame) 

changes = [] 
for column_name in frame.columns.values: 
    print('column_name: {0}'.format(column_name)) 
    changes.append(sum(frame[column_name]!=frame[column_name].shift(1))) 

print('changes: {0}'.format(changes)) 

リターン:

  time  X1  X2 
0 1234567000 96.32 23.88 
1 1234567005 96.01 23.96 
2 1234567009 96.05 23.96 
column_name: time 
column_name: X1 
column_name: X2 
changes: [3, 3, 2] 

答えて

2

値が数値である場合は、隣接する行との間の違いを取ることができますその差がゼロでないかどうかをテストする。そして、価値の変動の数をカウントするために、各列に合計を降ろす:

In [48]: (frame.diff(axis=0) != 0).sum(axis=0) 
Out[48]: 
time 3 
X1  3 
X2  2 
dtype: int64 

値は必ずしも数値でない場合は、より一般的な方法は になりshiftがでダウン-edそれ自体に対してframeを比較1行 - 操作が全体のデータフレームの代わりに、列毎に行われている以外、これは、あなたが投稿したコードのようになります。

In [50]: (frame != frame.shift(axis=0)).sum(axis=0) 
Out[50]: 
time 3 
X1  3 
X2  2 
dtype: int64 

数値バージョンが速くなり、シフトされたバージョンは、より堅牢です。

+0

ありがとうございます!フォローアップ:[NaNを無視したパンダのデータフレーム内の各列の値の変化を数える](https://stackoverflow.com/q/45038037/395857) –

関連する問題