2017-09-10 16 views
0

2つのデータフレームが2つあり、1つはリストで構成されています。2つのデータフレーム間の要素の比較(リストの1つを含む)

in [00]: table01 
    out[00]: 
     a b 
    0 1 2 
    1 2 3 

    in [01]: table02 
    out[01]: 
      a  b 
    0 [2] [3] 
    1 [1,2] [1,2] 

次に、2つのテーブルを比較したいと思います。 table01の要素もtable02の同じ位置リストにある場合はTrueを返し、そうでない場合はFalseを返します。だから私は持っていたいの表は、次のとおりです。

  a  b 
    0 False False 
    1 True False 

私はtable02でTABLE01を試みたが、エラーメッセージが出てきた:「DATAFRAME」オブジェクトは変更可能です。したがって、彼らはハッシュ化することができません。

私にこの問題の解決方法を教えてください。どうもありがとう! setsdf.applymapを使用

+0

'table02'でTABLE01は試みのあまりないです... –

+0

、純粋な値を比較します。 table01 == table02は動作しますが、なぜ私の状態で動作しないのか理解できません。実際には、私がセルを1つずつ呼び出すと 'in'を使用し、その結果を元に戻すことが分かります。しかし、私の現在の解決策は時間がかかりすぎるので、私はこの質問をしています。私の不明な声明には申し訳ありません。 –

+0

'=='演算子はデータフレームを処理するためにオーバーロードされるためです。要素の比較は行われ、int!= listであるため、すべてがFalseです。 'in'はデータフレームのためにこのように動作しません。 –

答えて

2

​​

user3847943's solutionは良い代替であるが、set会員試験を使用して向上させることができました。

def find_in_array(a, b): 
    return a in b 

for c in df2.columns: 
    df2[c] = df2[c].map(set) 

vfunc = np.vectorize(find_in_array) 

df = pd.DataFrame(vfunc(df1, df2), index=df1.index, columns=df1.columns) 
df 

     a  b 
0 False False 
1 True False 
+0

こんにちは、時間があれば、df1.apply(lambda x:x.value in df2.loc [x.index、x.name] .values) 'という質問が出ます。 .. – Wen

+0

@Wen 'df2.loc [...]'はリスト項目を返し、リスト項目は.valuesを持ちません。それが最初の問題です。 2番目は 'x.values'はリストで、実際には' list2'で 'list1'を実行することはできませんが、動作しません。 –

+0

ありがとう、私は 'df1.apply(lambda x:df2.loc [x.index、x.name])'それは私がこの方法を使用して問題を解決することができると思いますdf2を返す – Wen

1

numpy.vectorizeを使用すると簡単にこれを行うことができます。サンプルコードは次のとおりです。

import numpy as np 
import pandas as pd 

t1 = pd.DataFrame([[1, 2],[2,3]]) 
t2 = pd.DataFrame([[[2],[3]],[[1,2],[1,2]]]) 

def find_in_array(a, b): 
    return a in b 

vfunc = np.vectorize(find_in_array) 

print(vfunc(t1, t2)) 
1

この

df=pd.melt(df1.reset_index(),'index') 
df['v2']=pd.melt(df2.reset_index(),'index').value 
pd.melt(df2.reset_index(),'index') 
df['BOOL']=df.apply(lambda x: True if x.value in x.v2 else False, axis = 1) 
df.pivot('index','variable','BOOL') 

Out[491]: 
variable  a  b 
index     
0   False False 
1   True False 

最後に試してみてください。うまく

df1.apply(lambda x: [(x==df2.loc[y,x.name])[y] for y in x.index]) 
Out[668]: 
     a  b 
0 False False 
1 True False 
関連する問題