2017-08-07 69 views
-1

我有一个数据帧DF1,看起来像 -找出失配之间两个列值

user  data        dep      
1  ['dep_78','fg7uy8']    78 
2  ['the_dep_45','34_dep','re23u'] 45 
3  ['fhj56','dep_89','hgjl09']  91 

我想集中列的“数据”与含有字符串值“DEP”,看看是否数量附加到该字符串与“dep”列中的数字匹配。例如,用户1的数据列中的dep_78与dep列中的dep 78匹配。我想输出不匹配的行。所以结果应该给我 -

user  data      dep 
2  ['the_dep_45','34_dep'] 45 
3  ['dep_89']    91 

的问题是只取特定值的数据列与字符串“DEP”,然后比较附有与“DEP”列这些字符串的数字。

+0

在“data”列中包含“dep”的所有字符串附加的数字应该与“dep”列中的数字匹配。数据中的dep_89与dep列中的91不匹配。 – ComplexData

+1

这是我在电话上看的错,我错过了第一个街区的'dep'。不过,我认为你的第一步是将数据中的字符串分开?为什么你首先有这种格式的数据框? – roganjosh

+1

你能为你的问题提供一些背景吗?你试过什么了?为什么不按照给你的建议重构你的数据框[这里](https://stackoverflow.com/questions/45552952/extracting-specific-rows-from-a-data-frame/45553169#45553169)? – RagingRoosevelt

回答

-1

你可以做到这一点

def select(row): 
    keystring = 'dep_'+str(row['dep']) 
    result = [] 
    for one in row['data']: 
     if (one!=keystring)&('dep' in one): 
      result.append(one) 
    return result 

df['data'] =df.apply(lambda x:select(x),axis=1) 
df['datalength'] = df['data'].map(lambda x:len(x)) 
result = df[df['datalength']>0][df.columns[:3]] 
print(result) 
    user     data dep 
1  2 [the_dep_45, 34_dep] 45 
2  3    [dep_89] 91 
+0

'[]'在这里不太理想。解决方案当然是要修复最初的DF?我不明白为什么所有东西都放在一列中 – roganjosh

+0

@roganjosh你可以直接过滤它们。 –

+0

好的,但为什么用这种方法打扰熊猫呢?它运行在python时间,所以你不妨使用'for'循环 – roganjosh

0

这个怎么样?

import re 

r = re.compile('\d+') 

idx = df.apply(lambda x: str(x['dep']) in r.search(x['data']).group(0), axis=1) 

0  True 
1  True 
2 False 
dtype: bool 


df[idx] 

    user        data dep 
0  1    ['dep_78','fg7uy8'] 78 
1  2 ['the_dep_45','34_dep','re23u'] 45 
+0

TypeError:('期望的字符串或缓冲区',在索引0'发生了') – ComplexData

+0

它适用于您提供的样本数据 –

相关问题