2017-07-12 6 views
0

2列のデータフレームで同じ列が得られますが、列ごとに異なる行はどのようにして得られますか?例えば特定の列で共通の行、他の列とは異なる

COLS [A、B、C]のために2つのDFSにおいて同じ値を有するが、 '実際の'

import pandas as pd 
df = pd.DataFrame({"A":list(range(10)), 
        "B":list(range(10,20)), 
        "C":list(range(20,30)), 
        "D":list(range(30,40)), 
        "actual":[1 for x in range(10)]}) 

df2 = pd.DataFrame({"A":list(range(15)), 
        "B":list(range(5,20)), 
        "C":list(range(15,30)), 
        "D":list(range(45,60)), 
        "actual":[0 for x in range(15)]}) 

    df.iloc[5] = [5,10,20,20,1] 
Out[12]: 
    A B C D actual 
0 0 10 20 30  1 
1 1 11 21 31  1 
2 2 12 22 32  1 
3 3 13 23 33  1 
4 4 14 24 34  1 
5 5 10 20 20  1 
6 6 16 26 36  1 
7 7 17 27 37  1 
8 8 18 28 38  1 
9 9 19 29 39  1 

df2 
Out[13]: 
    A B C D actual 
0 0 5 15 45  0 
1 1 6 16 46  0 
2 2 7 17 47  0 
3 3 8 18 48  0 
4 4 9 19 49  0 
5 5 10 20 50  0 
6 6 11 21 51  0 
7 7 12 22 52  0 
8 8 13 23 53  0 
9 9 14 24 54  0 
10 10 15 25 55  0 
11 11 16 26 56  0 
12 12 17 27 57  0 
13 13 18 28 58  0 
14 14 19 29 59  0 

欲しい列の異なる値を持つ行を選びdf1内のすべてのインデックスはdf1と同じですが、実際の値は異なります。例えば、

A B C D 
5 10 20 50 

これはdf2のインデックス5です。

助けてもらえますか? :)

+1

「A:5、B:10、C:20、D:50」は最初のdfには表示されません。 – ayhan

+0

@ayhan私の悪い、固定! – Wboy

答えて

3
df.merge(df2, on=list('ABCD')) 

は、両方のDataFramesが列の値と同じ値を持つDataFrameを提供します。 actual列の場合、2つの列、actual_xおよびactual_yが生成されます。

A B C D actual_x actual_y 
0 5 10 20 50   1   0 

あなたは別の条件を渡したい場合は、これはと行うことができます。

df.merge(df2, on=list('ABCD'))[lambda v: v['actual_x'] != v['actual_y']] 
# Or 
df.merge(df2, on=list('ABCD')).query('actual_x != actual_y') 

これはあなたの両方のdfのがABCDに同じ値を持っていますが、actualに異なる値を持つデータフレームを与えますカラム。

+0

マージに 'D'列を含めるかどうかわかりませんが、そうでない場合はドロップするだけです。次に、 'D_x'と' D_y'を生成します。 2番目のDataFrame上にあるものを望むなら、 '[D_y]'でインデックス付けするだけで済みます。 – ayhan

+0

これは大きなデータフレームでクラッシュします。行のインデックスを取得する方法はありますか?たとえば、共通の行がdf1のインデックス1でdf2の行が4の場合、[1,4] – Wboy

+0

マージ後、はい。しかし、マージなしでそれをしたい場合は、自分で個々の列をチェックすることができますが、これが役立つかどうかはわかりません。記憶のせいでクラッシュしますか? DataFramesの大きさはどれくらいですか? – ayhan

関連する問題