看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本例,针对两个数据,其中根据一个列是否包含在另外一个列数据中的情况,来扩展为一个新的数据,主要训练我们熟练掌握数据的构造、变形等操作。
我们构造数据如下:
import pandas as pd
data1 = {'A': ['ABC', 'EF', 'DF', 'OP']}
data2 = {'B': ['ABC123', 'AB', 'ABCEF', 'DFWAQ', 'ABCEF', 'ABCEFBC']}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df1
'''
A
0 ABC
1 EF
2 DF
3 OP
'''
df2
'''
B
0 ABC123
1 AB
2 ABCEF
3 DFWAQ
4 ABCEF
5 ABCEFBC
'''
将第一个表中的 A,全部跟第二表中的B全部模糊匹配以下(只要B中包含A都显示出来),然后将 A 在 B 中包含的全部提取出来。即:
A B
ABC ABC123
ABC ABCEF
ABC ABCEF
ABC ABCEFBC
EF ABCEF
EF ABCEF
EF ABCEFBC
DF DFWAQ
针对这个问题,我们有两种思路。第一种是增加一个辅助列,这个列是 A 列对应包含它的所有 B 列的值,它是一个序列(Series 即可),然后两用 explode() 方法以这个序列进行爆炸,就得到了最终的数据(要删除没有对应包含数据的)。
第二种思路是,用迭代的思维,先建立一个空的 DataFrame,用以对它进行数据的填充。迭代 A 列,依次判断出所有包含它的 B 列内容(它是一个 DataFrame),然后用 concat() 函数将它们拼接进来。
第一种思路的代码:
(
df1.assign(B=df1.A.map(lambda x: df2[df2.B.str.contains(x)].B))
.explode('B')
.dropna()
)
'''
A B
0 ABC ABC123
0 ABC ABCEF
0 ABC ABCEF
0 ABC ABCEFBC
1 EF ABCEF
1 EF ABCEF
1 EF ABCEFBC
2 DF DFWAQ
'''
思路二:
df = pd.DataFrame()
for i in df1.A:
df_temp = (
df2.loc[df2.B.str.contains(i)]
.assign(A=i)
)
df = pd.concat([df, df_temp])
df
'''
B A
0 ABC123 ABC
2 ABCEF ABC
4 ABCEF ABC
5 ABCEFBC ABC
2 ABCEF EF
4 ABCEF EF
5 ABCEFBC EF
3 DFWAQ DF
'''
这样就完成了需求。
(完)
更新时间:2024-08-18 16:21:39 标签:pandas python 扩展