Python,Pandas:检查列的列表值中的每个元素是否存在于其他dataframe中
我有一个dataframe列,其中的值在列表中,如果它们在其他dataframe中,我想添加一个新列,其中包含列表中筛选出的值 df: df2: 我需要在Python,Pandas:检查列的列表值中的每个元素是否存在于其他dataframe中,python,pandas,list,dataframe,mapping,Python,Pandas,List,Dataframe,Mapping,我有一个dataframe列,其中的值在列表中,如果它们在其他dataframe中,我想添加一个新列,其中包含列表中筛选出的值 df: df2: 我需要在df中添加带有过滤列b的新列,以便它只包含df2列e中的元素列表 结果: **a**|**b**|**c** :-----:|:-----:|:-----: 1|[10, 1, 'xxx']|[1,'xxx'] 2|[]|[] 5|[1, 2, 3]|[1] 7|[5]|[5] 速度至关重要,因为有大量的记录 我现在所做的: 创建了一组可能的
df
中添加带有过滤列b
的新列,以便它只包含df2
列e
中的元素列表
结果:
**a**|**b**|**c**
:-----:|:-----:|:-----:
1|[10, 1, 'xxx']|[1,'xxx']
2|[]|[]
5|[1, 2, 3]|[1]
7|[5]|[5]
速度至关重要,因为有大量的记录
我现在所做的:
df。为
分配全面的列表,但它不太有效,而且速度太慢在列表和df2中,不总是整数值,有时是字符串。您可以尝试强制转换为
str
,然后再转换为series.str.findall
l = map(str,df2['e'].unique())
df['c'] = df['b'].astype(str).str.findall('|'.join([fr"\b{i}\b" for i in l]))
或findall图案上的较短字体@:
您可以尝试强制转换到
str
,然后再转换到series.str.findall
l = map(str,df2['e'].unique())
df['c'] = df['b'].astype(str).str.findall('|'.join([fr"\b{i}\b" for i in l]))
或findall图案上的较短字体@:
您可以按如下方式使用:
l = df2['e'].unique() # unique() already returns ndarray, no need to use list()
df['c'] = df['b'].map(lambda x: np.intersect1d(x, l))
print(df)
a b c
0 1 [10, 1, 100] [1]
1 2 [] []
2 5 [1, 2, 3] [1]
3 7 [5] [5]
4 9 [25, 27] [25]
编辑
根据OP对混合类型数据的编辑,我们只需要修改df2
的e
列的唯一值的提取方式。无需更改创建列c
的主代码
l = list(map(str, df2['e'].unique())) # only change this
df['c'] = df['b'].map(lambda x: np.intersect1d(x, l))
print(df)
a b c
0 1 [10, 1, xxx] [1, xxx]
1 2 [] []
2 5 [1, 2, 3] [1]
3 7 [5] [5]
4 9 [25, 27] [25]
您可以按如下方式使用:
l = df2['e'].unique() # unique() already returns ndarray, no need to use list()
df['c'] = df['b'].map(lambda x: np.intersect1d(x, l))
print(df)
a b c
0 1 [10, 1, 100] [1]
1 2 [] []
2 5 [1, 2, 3] [1]
3 7 [5] [5]
4 9 [25, 27] [25]
编辑
根据OP对混合类型数据的编辑,我们只需要修改df2
的e
列的唯一值的提取方式。无需更改创建列c
的主代码
l = list(map(str, df2['e'].unique())) # only change this
df['c'] = df['b'].map(lambda x: np.intersect1d(x, l))
print(df)
a b c
0 1 [10, 1, xxx] [1, xxx]
1 2 [] []
2 5 [1, 2, 3] [1]
3 7 [5] [5]
4 9 [25, 27] [25]
@ShubhamSharma感谢更新:-)抱歉,没有提到-它不完全是int值,有时是字符串,有时是float/int作为字符串。所以,最好是把所有的东西都看作一个字符串。如果所有的东西都是一个字符串,假设列表是正确的列表,则不是列表的字符串表示:使用<代码> L= DF2[E' ]。UNIQUE()<代码> > DF['C']=DF[[ B ] ]。但是如果您有混合的数据类型,您仍然需要使用StringTo stringYes的早期答案,谢谢!您能否帮助修改以将结果存储在c列中,而不是列表,而是字符串逗号分隔?@Oleksii
.map(','.join)
位于最后一行的代码之后df['b'].astype(str).str.findall(fr“\b({''124;'.join(l)})\b”).map('','.join)
@ShubhamSharma感谢更新:-)抱歉,没有提到-它不完全是int值,有时是字符串,有时是float/int作为字符串。所以,最好是把所有的东西都看作一个字符串。如果所有的东西都是一个字符串,假设列表是正确的列表,则不是列表的字符串表示:使用<代码> L= DF2[E' ]。UNIQUE()<代码> > DF['C']=DF[[ B ] ]。但是如果您有混合的数据类型,您仍然需要使用StringTo stringYes的早期答案,谢谢!您能否帮助修改以将结果存储在c列中,而不是列表,而是字符串逗号分隔?@Oleksii.map(','.join)
位于最后一行的代码之后df['b'].astype(str).str.findall(fr“\b({''124;'.join(l)})\b”).map('','.join)
nice,还没有测试过,但我认为这可能比我的更快,因为字符串转换开销。抱歉,没有提到-不仅仅是int值,有时是字符串,有时float/int作为字符串。@Oleksii我使用numpy函数的解决方案不假设数据类型是字符串、int或float,甚至混合类型,numpy也支持这些类型。我不需要任何类型的铸造。所以,没问题。@Oleksii对解决方案进行了微调,以支持对混合类型的编辑。@Oleksii噢,通常numpy函数应该运行得很快。在这种情况下,可能是因为我们需要在Pandas和numpy之间进行接口,map()函数只需迭代调用np.intersect1d
,而无需优化向量化操作。我试着用另一种方式称它为np.intersect1d(df['b'],l)
,但它似乎不接受这个系列,因为它是2D而不是以列表为元素的1D。继续使用更快的工具。:-)很好,我还没有测试过,但我认为这可能比我的更快,因为字符串转换开销。对不起,没有提到-不仅仅是int值,有时是字符串,有时是float/int作为字符串。@Oleksii我使用numpy函数的解决方案没有假设数据类型是否为字符串,int或float甚至混合类型,numpy也支持这些类型。我不需要任何类型的铸造。所以,没问题。@Oleksii对解决方案进行了微调,以支持对混合类型的编辑。@Oleksii噢,通常numpy函数应该运行得很快。在这种情况下,可能是因为我们需要在Pandas和numpy之间进行接口,map()函数只需迭代调用np.intersect1d
,而无需优化向量化操作。我试着用另一种方式称它为np.intersect1d(df['b'],l)
,但它似乎不接受这个系列,因为它是2D而不是以列表为元素的1D。继续使用更快的工具。:-)
l = map(str,df2['e'].unique())
df['c'] = df['b'].astype(str).str.findall(fr"\b({'|'.join(l)})\b")
print(df)
a b c
0 1 [10, 1, 100] [1]
1 2 [] []
2 5 [1, 2, 3] [1]
3 7 [5] [5]
4 9 [25, 27] [25]
l = df2['e'].unique() # unique() already returns ndarray, no need to use list()
df['c'] = df['b'].map(lambda x: np.intersect1d(x, l))
print(df)
a b c
0 1 [10, 1, 100] [1]
1 2 [] []
2 5 [1, 2, 3] [1]
3 7 [5] [5]
4 9 [25, 27] [25]
l = list(map(str, df2['e'].unique())) # only change this
df['c'] = df['b'].map(lambda x: np.intersect1d(x, l))
print(df)
a b c
0 1 [10, 1, xxx] [1, xxx]
1 2 [] []
2 5 [1, 2, 3] [1]
3 7 [5] [5]
4 9 [25, 27] [25]