2016-05-12 12 views
2
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のデータフレームの行を等価で比較する方法

答えて

2

用途:

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 
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にアクセスします。

関連する問題