はじめに
値変化があった行のみ抽出(上の行と同じ場合は行を削除)する方法を残します。
具体的には以下です。
変更前csv
data1 data2 data3 data4
0 0 600 700 801 ←0番と1番はdata2からdata4が同じデータなので消える
1 1 600 700 801
2 2 602 700 804
3 3 601 704 805 ←3番と4番はdata2からdata4が同じデータなので消える
4 4 601 704 805
5 5 601 702 802
変更後csv
data1 data2 data3 data4
1 1 600 700 801
2 2 602 700 804
4 4 601 704 805
5 5 601 702 802
コード
python
import pandas as pd
df = pd.read_csv('test.csv')
print(df)
"""
data1 data2 data3 data4
0 0 600 700 801
1 1 600 700 801
2 2 602 700 804
3 3 601 704 805
4 4 601 704 805
5 5 601 702 802
"""
df = df.loc[(df.iloc[:,1:] != df.shift(-1).iloc[:,1:]).sum(axis=1) != 0]
print(df)
"""
data1 data2 data3 data4
1 1 600 700 801
2 2 602 700 804
4 4 601 704 805
5 5 601 702 802
"""
詳細
順番に処理を追っていった結果です。
import pandas as pd
df = pd.read_csv('test.csv')
print(df)
"""
data1 data2 data3 data4
0 0 600 700 801
1 1 600 700 801
2 2 602 700 804
3 3 601 704 805
4 4 601 704 805
5 5 601 702 802
"""
#data1はインデックスなので処理の対象としない
print(df.shift(0).iloc[:,1:])
"""
data2 data3 data4
0 600 700 801
1 600 700 801
2 602 700 804
3 601 704 805
4 601 704 805
5 601 702 802
"""
#shiftで行をずらす
print(df.shift(-1).iloc[:,1:])
"""
data2 data3 data4
0 600.0 700.0 801.0
1 602.0 700.0 804.0
2 601.0 704.0 805.0
3 601.0 704.0 805.0
4 601.0 702.0 802.0
5 NaN NaN NaN
"""
#一致したデータはfalseとなる
print(df.iloc[:,1:] != df.shift(-1).iloc[:,1:])
"""
data2 data3 data4
0 False False False
1 True False True
2 True True True
3 False False False
4 False True True
5 True True True
"""
#各行のtrueの数をカウント
print((df.iloc[:,1:] != df.shift(-1).iloc[:,1:]).sum(axis=1))
""""
0 0
1 2
2 3
3 0
4 2
5 3
"""
#全てデータが一致している行がfalse
#1つでもデータ異なっている場合はtureとなる
print((df.iloc[:,1:] != df.shift(-1).iloc[:,1:]).sum(axis=1) != 0)
"""
0 False
1 True
2 True
3 False
4 True
5 True
"""
#tureの行を抽出する
df = df.loc[(df.iloc[:,1:] != df.shift(-1).iloc[:,1:]).sum(axis=1) != 0]
print(df)
"""
data1 data2 data3 data4
1 1 600 700 801
2 2 602 700 804
4 4 601 704 805
5 5 601 702 802
"""
コメント