python pandas 値変化があった行のみ抽出

python

はじめに

値変化があった行のみ抽出(上の行と同じ場合は行を削除)する方法を残します。
具体的には以下です。

変更前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
"""

コメント

タイトルとURLをコピーしました