2017-08-25 7 views
1

ワイルドカード一般的に、ここでワイルドカードに基づいてパンダのデータフレームに参加するには?

import pandas as pd 
data = [[".",".",1],["AB.","B.",3],["B.",".",2]] 
data2 = [["A","B","1"],["ABC","BC",4],["B","A",2]] 
columns = ["Type1","Type2","Value"] 
df = pd.DataFrame(data,columns=columns) 
df2 = pd.DataFrame(data2,columns=columns) 
print(df) 
print(df2) 
    Type1 Type2 Value 
0  *  *  1 
1 AB* B*  3 
2 B*  *  2 
    Type1 Type2 Value 
0  A  B  1 
1 ABC BC  4 
2  B  A  2 

としてDF2の2行目は、DF2にライン0のに対し、ライン1とライン2 と一致する必要があります*なければならない私は& DF2 DF 2つのデータフレームを持っていると私はそれらを統合したいと思いますdf1の最初の行にのみ一致します。 どういうわけか私は

df2.merge(df,how='left',on=["Type1","Type2"]) 

しかし、ここでの結果は何も一致していないようなものを取得したいと思います。

これは私が得たい結果です。

data3 = [["A","B","1","1"],["ABC","BC",4,1],["ABC","BC",4,3],["B","A",2,1],["B","A",2,2]] 
columns3 = ["Type1","Type2","Value_x","Value_y"] 
results = pd.DataFrame(data3,columns=columns3) 
print(results) 
    Type1 Type2 Value_x Value_y 
0  A  B  1  1 
1 ABC BC  4  1 
2 ABC BC  4  3 
3  B  A  2  1 
4  B  A  2  2 

実際にdf2テーブルには100万行以上があるので、効率の理由からループを実行する余裕はないことに注意してください。

+0

期待どおりの結果ですか? – Alexander

+0

私はちょうどそれをやったよ:) – Nicolas

答えて

0

最後に、以下のコードを使用することにしました。これにより、データフレームがSQLiteデータベースに転送された後、結合が実行され、最後に別のデータフレームに戻ります。これは最適ではありませんが動作します。

import sqlite3 
conn = sqlite3.connect(':memory:') 
df.to_sql('df', conn, index=False) 
df2.to_sql('df2', conn, index=False) 
query = """ 
SELECT [df2].[Type1], 
     [df2].[Type2], 
     [df2].[value], 
     [df].[value] 
FROM ([df] 
     LEFT OUTER JOIN [df2] 
        ON [df].[type1] LIKE [df2].[type1] 
        AND [df].[type2] LIKE [df2].[type2]) 
""" 
df3 = pd.read_sql_query(query, conn) 
conn.close() 
関連する問題