【问题标题】:Figure out mismatch amongst two column values找出两列值之间的不匹配
【发布时间】:2023-03-30 17:43:01
【问题描述】:

我有一个数据框 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”列进行比较。

【问题讨论】:

  • “data”列中所有包含“dep”的字符串所附的数字应与“dep”列中的数字相匹配。数据中的 dep_89 与 dep 列中的 91 不匹配。
  • 看手机是我的错,我错过了第一个街区的dep。不过,我认为您的第一步是拆分data 中的字符串?为什么首先要有这种格式的数据框?
  • 您能否为您的问题提供一些背景信息?你都尝试了些什么?为什么不按照here 的建议重构您的数据框?

标签: python pandas numpy jupyter-notebook


【解决方案1】:

这个怎么样?

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

【讨论】:

  • TypeError: ('expected string or buffer', u'occurred at index 0')
【解决方案2】:

你可以这样做

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

【讨论】:

  • [] 在这里不太理想。当然,解决方案是修复初始 DF?我不明白为什么一开始所有东西都放在一列中
  • @roganjosh 你可以直接按长度过滤它们。
  • 好的,但是为什么还要用这种方法来打扰熊猫呢?它在 python 时间运行,所以你也可以使用 for 循环
  • 预期输出不是 OP 要求的。
  • @aws_apprentice 我认为你应该清楚地看到问题,你的答案是前两行,但希望输出是最后两行
猜你喜欢
  • 2015-05-23
  • 2021-09-29
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多