比较同一数据框中的两个数据框列,并返回第一列中包含的文本

时间:2019-05-31 00:46:59

标签: python pandas

我已将数据加载到数据帧中,但无法弄清楚如何将已解析的数据与另一列进行比较,并仅返回匹配项。

这似乎应该很容易,但是我看不到。我试图将这些值分开进行比较,但这就是我遇到的问题。

import pandas as pd

df = pd.DataFrame({ 'col1': [';t9010;',';c1312;',';d1310;c1512;'],
                    'col2': [';t1010;d1010;c1012;',';t1210;d1210;c1312;',';t1310;d1310;c1412;']})

df['col1_split'] = df['col1'].str.split(';')
df['col2_split'] = df['col2'].str.split(';')


# output something like...
df['output'] = [null,';c1312;',';d1310;']

我希望看到类似-

第一行-返回空值,因为t9010中不包含col2_split

第二行-返回c1312中的col2_split

第三行-返回d1310但不返回c1512,因为d1310中只有col2_split

最后,最终文本应以分号分隔并以分号开头和结尾,即;t9010;;c1312;;d1310;c1512;(如果有多个分号)。

3 个答案:

答案 0 :(得分:2)

您尝试使用“;”分割的部分是正确的。之后,您需要将col1_split中的每个元素与col2_split中的每个元素进行比较。您可以编写一个简单的函数来避免多次循环,并使用pandas apply函数完成其余工作

这是相同代码的示例代码

import pandas as pd

df = pd.DataFrame({ 'col1': [';t9010;',';c1312;',';d1310;c1512;'],
                    'col2': [';t1010;d1010;c1012;',';t1210;d1210;c1312;',';t1310;d1310;c1412;']})

df['col1_split'] = df['col1'].str.split(';')
df['col2_split'] = df['col2'].str.split(';')

def value_check(list1, list2):
    string = ""
    for i in list1:
        if (i in list2) & (len(i)>0):
            string += ";"+i+';'
    return string

df['output'] = df.apply(lambda x: value_check(x.col1_split, x.col2_split), axis=1)
df

输出

enter image description here

答案 1 :(得分:0)

如果其值位于col1中,则可以尝试使用此方法获取col2中的所有值。该方法是通过将每行中的字符串值拆分为一个列表,然后首先在列表值([])中忽略空值或长度小于0的字符串。然后在与col1匹配的col2中搜索没有空值的值,并将输出显示到output列。

df = pd.DataFrame({ 'col1': [';t9010;',';c1312;',';d1310;c1512;'],
                    'col2': [';t1010;d1010;c1012;',';t1210;d1210;c1312;',';t1310;d1310;c1412;']})

#splitting & omitting the empty values
df['col1_split']=df.col1.apply(lambda x: list((pd.Series(x.split(';')))[(pd.Series(x.split(';'))).apply(len)>0]))
df['col2_split']=df.col2.apply(lambda x: list((pd.Series(x.split(';')))[(pd.Series(x.split(';'))).apply(len)>0]))

def check(list1, list2):
    res=''
    for i in list1:
        if (i in list2): res += ';'+str(i)
    #semicolon cover at the end of string in each row
    if len(res)>0: res+=';'
    return res

df['output']=df.apply(lambda x: check(x.col1_split, x.col2_split), axis=1)
df

输出:

希望这可以为您提供帮助。

答案 2 :(得分:-1)

为此,我们可以使用嵌套的list理解:

df['common'] = pd.Series([[sub for sub in left if sub in right] for left, right in zip(df['col1_split'], df['col2_split'])]).str.join(';')

print(df['common'])

输出:

0          ;
1    ;c1312;
2    ;d1310;
Name: common, dtype: object