如何根据通配符加入 pandas 数据框?
How to join pandas dataframes based on wildcards?
我有两个数据帧 df 和 df2,我想将它们与 * 作为通配符合并
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 的第二行应该与第一行和第二行匹配。
而 df2 中的第 0 行应该只匹配 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 table 实际上有超过 100 万行,因此出于效率原因我无法进行循环。
最后我决定使用下面的代码。这会将数据框传输到 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()
我有两个数据帧 df 和 df2,我想将它们与 * 作为通配符合并
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 的第二行应该与第一行和第二行匹配。 而 df2 中的第 0 行应该只匹配 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 table 实际上有超过 100 万行,因此出于效率原因我无法进行循环。
最后我决定使用下面的代码。这会将数据框传输到 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()