【问题标题】:Return True if a String In one Dateframe is in Multiple Columns of Another Dataframe (Time Complexity)如果一个数据帧中的字符串在另一个数据帧的多列中,则返回 True(时间复杂度)
【发布时间】:2020-08-13 17:41:45
【问题描述】:

我在下面有 2 个数据框。我的目标是检查列 df['A'] 的值是否在第二个数据帧 df2['B'] 或 df2['C'] 的多个列中,如果存在该值,则返回 true 或 false。 test 列是我的输出列。

df

A       test     
q       True 
w       False
e       True 

df2

B       C     
q       r 
g       r
g       e 

下面我当前的代码可以工作,但是处理成百上千行的代码非常慢。在下面的这种情况下,我使用list 方法将 df2 的 2 列转换为列表并检查字符串是否在这些列表中。但是我需要比这更快的东西。

listb = df2['B'].to_list()
listc = df2['C'].to_list()

df['test'] = df['A'].apply(lambda x: 'True' if x in (listb or listc) else 'False') 

我一直在尝试使用 .isin() 方法,但似乎无法让它与多个列一起使用以在单独的数据集中搜索多个列。但是,此代码运行返回所有不正确的 False。

df['test'] = df['A'].isin(df2[['B','C']]).any(axis = 1) 

【问题讨论】:

    标签: python pandas list numpy dataframe


    【解决方案1】:

    你可以在解开另一个 DataFrame 之后使用isin。或np.in1D。将结果分配回df['test']

    np.in1d(df1['A'], df2)
    #array([ True, False,  True])
    
    df['A'].isin(df2.to_numpy().ravel())
    #0     True
    #1    False
    #2     True
    #Name: A, dtype: bool
    

    【讨论】:

    • 等等,也许我不理解这个问题,我认为在这种情况下它仍然是[True, False, True],因为掩码是基于 A 中的值是否在 B 或 C 中的任何位置找到的,而2 仍然不在这 6 个值中
    • @aloz 这是正确的。我正在查看该值是否在 2 列中的任何位置。因此将搜索 6 个总值。我不得不改变这个问题,因为我的数据是文本格式而不是数字。对此感到抱歉。
    • @Alollz 谢谢!您的代码仍在运行我真的很想知道为什么我不能对多列使用简单的 .isin() 方法
    • @JamesScott 如果仍然很慢,您可以尝试使用.isin(np.unique(df2.to_numpy().ravel()))。如果您有许多重复值可能会加快速度。
    • @JamesScott 当您将 DataFrame 用作 values for .isin 时,它需要在索引和列上对齐。你真的不想要那种对齐,所以你不能使用 DataFrame。您只需要数组,以便它在 DataFrame 中检查 anywhere 的值,而不仅仅是在分别使用 Series 或 DataFrame 作为值时在行或行和列上检查。
    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 2021-04-03
    • 1970-01-01
    • 2021-11-15
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    相关资源
    最近更新 更多