Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,Pandas:检查列的列表值中的每个元素是否存在于其他dataframe中_Python_Pandas_List_Dataframe_Mapping - Fatal编程技术网

Python,Pandas:检查列的列表值中的每个元素是否存在于其他dataframe中

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] 速度至关重要,因为有大量的记录 我现在所做的: 创建了一组可能的

我有一个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。为
    分配全面的列表,但它不太有效,而且速度太慢
  • 谢谢你的帮助

    UPD
    在列表和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]