Pandas - 遍历数据框并在列表的任何元素与另一个列表的任何元素匹配时加入
Pandas - iterate through dataframe and join if any element of a list matches any element of another list
我有两个系列,两个系列的每个单元格都包含一个随机长度的元素列表。我的目标是在这两个系列之间执行交叉连接,但仅当一个系列的单元格列表中的至少一个元素与另一个系列中的单元格列表的元素匹配时才连接行。
例如:
series_a
0 [1geor, georg, eorge, orges, rgesq, gesqu, esq...
1 [1mark, marks, arksq, rksqu, ksqua, squar, qua...
2 [1prim, primr, rimro, imros, mrose, roses, ose...
3 [1shan, shank, hanka, ankar, nkars, karst, wew...
4 [1stka, stkat, tkath, katha, athar, thari, har...
series_b
0 [115br, 15bro, 5broa, broad, roadw, oadwa, adway]
1 [11par, 1park, parkp, arkpl, rkpla, kplac, place]
2 [125we, 25wes, 5west, west2, est25, st25t, t25th]
3 [135ma, 35mad, 5madi, madis, adiso, dison]
4 [135we, 35wes, 5west, west4, est41]
我想检查 series_a 中的每一行,如果一行中至少有一个元素 = series_b 行中的一个元素,如果是,则将这些行连接在一起一个新的数据框。
因此,查看 series_a 的第一行,检查“1geor”是否存在于第一、第二、第三行中。等等 series_b 列表;如果为 TRUE,则执行连接,如果为 FALSE,则不执行连接。
为了澄清,返回的数据框应该有两列,其中第一列包含来自 series_a 的单元格,第二列包含来自 series_b 的单元格。对于此数据框中的所有行,第一列中的列表应该至少有一个可以在第二列列表中找到的元素。例如:
returned_df
0 [115br, 15bro, 5broa] | [15bro, abcde, 12345, hello, world, test1]
1 [11par, 1park, parkp, arkpl, rkpla] | [parkp, broad]
2 [125we, 25wes, 5west, west2, est25, st25t, t25th] | [t25th, sadlf, 234lgk]
...
如果 series_a 中一行中的元素出现在 series_b 中的不止一行中,匹配行的所有组合都应出现在最终数据框中。
本练习最有效的 Python 代码是什么?代码:
any(elem in b for elem in a)
针对两个特定列表轻松回答这个问题,但我想完整地遍历这两个系列。
谢谢!
一旦你的系列中有 object
数据类型,我会使用 列表理解,并且 pandas
字符串方法和迭代方法非常慢。
elements = [(item, elem) for item in series_a.tolist()\
for elem in series_b.tolist()\
if bool(set(item).intersection(elem))]
df_final = pd.DataFrame(elements)
我有两个系列,两个系列的每个单元格都包含一个随机长度的元素列表。我的目标是在这两个系列之间执行交叉连接,但仅当一个系列的单元格列表中的至少一个元素与另一个系列中的单元格列表的元素匹配时才连接行。
例如:
series_a
0 [1geor, georg, eorge, orges, rgesq, gesqu, esq...
1 [1mark, marks, arksq, rksqu, ksqua, squar, qua...
2 [1prim, primr, rimro, imros, mrose, roses, ose...
3 [1shan, shank, hanka, ankar, nkars, karst, wew...
4 [1stka, stkat, tkath, katha, athar, thari, har...
series_b
0 [115br, 15bro, 5broa, broad, roadw, oadwa, adway]
1 [11par, 1park, parkp, arkpl, rkpla, kplac, place]
2 [125we, 25wes, 5west, west2, est25, st25t, t25th]
3 [135ma, 35mad, 5madi, madis, adiso, dison]
4 [135we, 35wes, 5west, west4, est41]
我想检查 series_a 中的每一行,如果一行中至少有一个元素 = series_b 行中的一个元素,如果是,则将这些行连接在一起一个新的数据框。
因此,查看 series_a 的第一行,检查“1geor”是否存在于第一、第二、第三行中。等等 series_b 列表;如果为 TRUE,则执行连接,如果为 FALSE,则不执行连接。
为了澄清,返回的数据框应该有两列,其中第一列包含来自 series_a 的单元格,第二列包含来自 series_b 的单元格。对于此数据框中的所有行,第一列中的列表应该至少有一个可以在第二列列表中找到的元素。例如:
returned_df
0 [115br, 15bro, 5broa] | [15bro, abcde, 12345, hello, world, test1]
1 [11par, 1park, parkp, arkpl, rkpla] | [parkp, broad]
2 [125we, 25wes, 5west, west2, est25, st25t, t25th] | [t25th, sadlf, 234lgk]
...
如果 series_a 中一行中的元素出现在 series_b 中的不止一行中,匹配行的所有组合都应出现在最终数据框中。
本练习最有效的 Python 代码是什么?代码:
any(elem in b for elem in a)
针对两个特定列表轻松回答这个问题,但我想完整地遍历这两个系列。
谢谢!
一旦你的系列中有 object
数据类型,我会使用 列表理解,并且 pandas
字符串方法和迭代方法非常慢。
elements = [(item, elem) for item in series_a.tolist()\
for elem in series_b.tolist()\
if bool(set(item).intersection(elem))]
df_final = pd.DataFrame(elements)