1 0 0 0 1
0 0 0 0 0
0 1 0 0 1
1 0 0 0 1
0 0 0 0 0
1 0 0 0 1
私はデータフレームを持っています(上記参照)。私は一致する行を取得するために、その行を比較する必要があります。だから私は上記のdfのために、row1 = row4 = row6とrow2 = row5を比較する必要があります。 Pythonでこの行の比較を行う効率的な方法はありますか?Pythonのデータフレームの行を等価で比較する方法
1 0 0 0 1
0 0 0 0 0
0 1 0 0 1
1 0 0 0 1
0 0 0 0 0
1 0 0 0 1
私はデータフレームを持っています(上記参照)。私は一致する行を取得するために、その行を比較する必要があります。だから私は上記のdfのために、row1 = row4 = row6とrow2 = row5を比較する必要があります。 Pythonでこの行の比較を行う効率的な方法はありますか?Pythonのデータフレームの行を等価で比較する方法
用途:
import pandas as pd
df = pd.DataFrame({0: {0: 1, 1: 0, 2: 0, 3: 1, 4: 0, 5: 1},
1: {0: 0, 1: 0, 2: 1, 3: 0, 4: 0, 5: 0},
2: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0},
3: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0},
4: {0: 1, 1: 0, 2: 1, 3: 1, 4: 0, 5: 1}})
print df
0 1 2 3 4
0 1 0 0 0 1
1 0 0 0 0 0
2 0 1 0 0 1
3 1 0 0 0 1
4 0 0 0 0 0
5 1 0 0 0 1
#first select only all duplicated rows
df1 = df[df.duplicated(keep=False)]
print df1
0 1 2 3 4
0 1 0 0 0 1
1 0 0 0 0 0
3 1 0 0 0 1
4 0 0 0 0 0
5 1 0 0 0 1
#sort values by all columns
df2 = df1.sort_values(by=df.columns.tolist())
print df2
0 1 2 3 4
1 0 0 0 0 0
4 0 0 0 0 0
0 1 0 0 0 1
3 1 0 0 0 1
5 1 0 0 0 1
#find groups
print (~((df2 == df2.shift(1)).all(1))).cumsum()
1 1
4 1
0 2
3 2
5 2
dtype: int32
#print groups
for i, g in df.groupby((~((df2 == df2.shift(1)).all(1))).cumsum()):
print g
0 1 2 3 4
1 0 0 0 0 0
4 0 0 0 0 0
0 1 2 3 4
0 1 0 0 0 1
3 1 0 0 0 1
5 1 0 0 0 1
#dict comprehension for storing groups
dfs = {i-1: g for i,g in df.groupby((~((df2 == df2.shift(1)).all(1))).cumsum())}
print dfs
{0.0: 0 1 2 3 4
1 0 0 0 0 0
4 0 0 0 0 0, 1.0: 0 1 2 3 4
0 1 0 0 0 1
3 1 0 0 0 1
5 1 0 0 0 1}
print dfs[0]
0 1 2 3 4
1 0 0 0 0 0
4 0 0 0 0 0
print dfs[1]
0 1 2 3 4
0 1 0 0 0 1
3 1 0 0 0 1
5 1 0 0 0 1
は、ここで私はそれを行うに思うだろう方法です。
import pandas as pd
df = pd.DataFrame({0: {0: 1, 1: 0, 2: 0, 3: 1, 4: 0, 5: 1},
1: {0: 0, 1: 0, 2: 1, 3: 0, 4: 0, 5: 0},
2: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0},
3: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0},
4: {0: 1, 1: 0, 2: 1, 3: 1, 4: 0, 5: 1}})
groups = df.groupby(df.columns.tolist())
df.loc[:, 'group_num'] = None
for num, group in enumerate(groups):
df.loc[group[1].index, 'group_num'] = num
利回り...
0 1 2 3 4 group_num
0 1 0 0 0 1 2
1 0 0 0 0 0 0
2 0 1 0 0 1 1
3 1 0 0 0 1 2
4 0 0 0 0 0 0
5 1 0 0 0 1 2
なぜグループ[1]最後の行に?
フォームのタプル(group_name、group_table)を反復処理しているためです。 group [1]は、実際にグループ化されたDataFrameにアクセスします。