【问题标题】:How to recognize order of values in column in Python Pandas Data Frame?如何识别 Python Pandas 数据框中列中值的顺序?
【发布时间】:2021-06-30 12:23:07
【问题描述】:

我在 Python Pandas 中有如下数据框:

import pandas as pd
import re
df = pd.DataFrame()
df["ADRESAT"] = ["Kowal Jan", "Nowak Adam PHU"]
df["NADAWCA"] = ["Jan Kowal", "Adam Nowak"]

我创建了 2 个新列:

  • col1 - 列“ADRESAT”中“NADAWCA”列的值

  • col2 - 其余值(“ADRESAT”列中的值超出“NADAWCA”列中的值)

    df["col2"] = df.apply(lambda r: re.sub(r["NADAWCA"], '', r["ADRESAT"], flags = re.IGNORECASE).strip(), 轴=1) df["col1"] = df["NADAWCA"].str.title()

尽管如此,结果我得到了如下所示的 df。但正如你在第二行看到的那样,有一个错误。

  • 在 col1 中正常(来自“NADAWCA”列的值,该值也在“ADRESAT”列中,但
  • 在 col2 中,我只需要 PHU(表示“ADRESAT”列中的值超出了“NADAWCA”列中的值)

我的问题:如何修改我的代码以识别 Adam Nowak 和 Nowak Adam 是相同的值?

我需要如下结果:

【问题讨论】:

  • 为什么col2 of line1 (Kowal Jan) 在您的预期输出中不为空?
  • 是的,你是对的,它应该是空的,我会改变它
  • 在 col2 需要是 ADRESAT 的值减去 NADAWCA 的值,所以如果你在 NADAWCA 有 Jan Kowal,在 ADRESAT 有 Kowal Jan(其他顺序相同) col2 是空的,但在条款第二行的 PHU 是 ADRESAT 中唯一一个不在 NADAWCA 中的值,因此 PHU 在第 2 行的 col2 中是有原因的
  • 我的问题是如何告诉 Python(使用我的代码或其他命题)Adam Nowak 和 Nowak Adam 是相同的值
  • 好的。现在好多了:-)我很快就会写一个解决方案。

标签: python pandas dataframe


【解决方案1】:

由于顺序很重要,使用set是不可能的,所以我们需要一个一个地检查每个单词:

# x[0] -> ADRESAT, x[1] -> NADAWCA
intersection = lambda x: ' '.join([x1 for x1 in x[1].split()
                             if x1.lower() in x[0].lower().split()])

difference = lambda x: ' '.join([x0 for x0 in x[0].split()
                           if not x0.lower() in x[1].lower().split()])

df['col1'] = df[['ADRESAT', 'NADAWCA']].apply(intersection, axis='columns')
df['col2'] = df[['ADRESAT', 'NADAWCA']].apply(difference, axis='columns')
>>> df
          ADRESAT     NADAWCA        col1 col2
0       Kowal Jan   Jan Kowal   Jan Kowal
1  Nowak Adam PHU  Adam Nowak  Adam Nowak  PHU

【讨论】:

  • 太棒了!可能工作正常,但我会更好地检查一下,最终我会写:) 正如我所见,字母的大小写并不重要,是吗? :)
  • 这个答案对 Python 3.7.4 是否正确?科拉连? :)
  • 你说得对。随意删除 lower 以进行区分大小写的比较(或使用 casefold 将“ß”等字符与“ss”进行比较。
  • 我不知道 3.7.4 但它适用于 3.6.9 和 3.9.5 :)
猜你喜欢
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2021-09-18
  • 2018-01-09
相关资源
最近更新 更多