【问题标题】:How to invoke pandas str.split() and not python's built in str.split()如何调用熊猫 str.split() 而不是 python 内置的 str.split()
【发布时间】:2017-03-31 10:43:09
【问题描述】:

我试图找到一个数据帧的所有行,其一个属性(比如 id_proof)值与以固定词(比如 PARENT)开头的另一列(比如 adr_proof)的第二部分匹配,并且相应的值应该匹配属于同一数据帧的部分。

例如,在数据框中:

import pandas as pd

main = {'account_number' : [1,2,3,4,5,6,7,8,9,10,11,12],
    'id_proof' : ['A','B','B','A','C','C','X','Y','X','Y','Y','X'],
    'id_value' : [101,201,301,401,501,601,111,222,333,444,555,666],
    'adr_proof' : ['Z','E','E','G','G','I','PARENT A','PARENT B','PARENT   B','PARENT C','PARENT C','PARENT A'],
    'adr_value' : [11,22,33,44,55,66,101,201,301,501,601,401]}
main = pd.DataFrame(main)

我正在努力实现:

node1    node2    relation
  1        7      parent-child
  2        8      parent-child
  3        9      parent-child
  4       12      parent-child
  5       10      parent-child
  6       11      parent-child

下面是我的代码。我知道我的代码不完整。我被 split() 函数困住了。我是 python 和 pandas 的新手,不知道如何调用 pandas 的 split() 函数而不是 python 的内置 str.split() 函数。我经历过这个question

import pandas as pd

main = {'account_number' : [1,2,3,4,5,6,7,8,9,10,11,12],
    'id_proof' : ['A','B','B','A','C','C','X','Y','X','Y','Y','X'],
    'id_value' : [101,201,301,401,501,601,111,222,333,444,555,666],
    'adr_proof' : ['Z','E','E','G','G','I','PARENT A','PARENT B','PARENT B','PARENT C','PARENT C','PARENT A'],
    'adr_value' : [11,22,33,44,55,66,101,201,301,501,601,401]}
main = pd.DataFrame(main)

df_group_count = pd.DataFrame({'count' : main.groupby(['adr_proof']).size()}).reset_index()
adr_type = df_group_count['adr_proof']
adr_type_parent = adr_type.loc[adr_type.str.startswith('PARENT',na=False)]

df_j_ = pd.DataFrame()
for j in adr_type_parent:
    dfn_j = main.loc[(main['adr_proof'] == j)]
    adr_type_parent_type = j.split(' ',expand=True,n=1)
    res = main.loc[(main['id_proof'] == adr_type_parent_type[1]) & (main['id_value'] == dfn_j['adr_value'])]

res

请提供一种方法来实现我的目标。输出是另一个数据帧。请原谅错误的代码或任何违规行为。还赞赏一种完全不同的方法。谢谢。

【问题讨论】:

  • 尝试使用re.split(' +',j,maxsplit=1) 或类似的微调版本,来自re 模块。
  • 我想使用 pandas.series.str.split() 以便结果可以是一个数据框。
  • 您打算从拆分的字符串构造什么样的数据框?在您的循环中,j 只是一个字符串,因此您需要自己对拆分字符串执行任何操作。但是您的下一行使用main['id_proof'] == adr_type_parent_type[1],并且在右侧的字符串中应该可以正常工作......不是吗?
  • 我打算从该行构造的结果数据框是一个数据框,其中两列第一列的值为“父”,第二列的值为“A”、“B”、“C”。

标签: python string pandas split


【解决方案1】:

由于您的主要问题似乎是如何合并熊猫拆分功能:

您可以使用以下方法隔离包含关键字“PARENT”的行:

parent_main = main[main.adr_proof.str.split(' ').str[0] == 'PARENT']

现在,您可以轻松提取第二个值:

parent_main.adr_proof.str.split(' ').str[-1]

【讨论】:

  • 我想第二行是:parent_main.adr_proof.str.splt(' ').str[-1]
  • 这行得通!谢谢。解决了我的问题。但我有点想知道问题关键的答案。我们可以掩盖这个功能吗?
  • 你到底是什么意思?您可以尝试from module import something as str 之类的东西。但是我没有看到这里的好处。
  • 我想知道我是否可以在字符串对象上调用 pandas.series.str.split 函数,而不是 python 内置的字符串拆分函数。
  • 您可以像我向您展示的那样在包含字符串的 pandas 系列中使用 split 的 pandas 版本,但您不能直接在字符串对象上使用它。
【解决方案2】:

在您的特定情况下,您无法调用 pandas 库的 str.split(),因为您使用的是 DataFrame 对象,而此特定对象未实现 str.split()。只有Series 对象实现了str.split()

【讨论】:

    【解决方案3】:

    在调查此问题并在 IRC 网络 freenode.net 上的#python 频道中讨论此问题后,我有一个答案给你。你不能用 pandas 库的 str.split() 掩盖 Python 的 str.split()

    另外,DataFrame 对象没有str.split()。我已经阅读了整个 API 并且还使用了 from ... import ... 以某种方式从 pandas 导入 str.split() 并掩盖了 Python 的 str.split()

    您在代码中使用的DataFrame 对象没有str.split()。代码中str.split() 没有抛出错误的唯一原因是因为它恰好是Python 内置并使用了str.split()

    我能找到的唯一具有str.split() 的熊猫对象是Series 对象pandas.Series.str.split()。但是您没有使用Series 对象,而是使用DataFrame 对象。对不起,没什么可做的。

    如果你问我,pandas 的结构被破坏了。您不能只导入str.split(),因为str 基本上是一个StringMethods 对象,而该对象位于strings 包下,该包位于core 包中,而core 包位于pandas 顶级包中.一团糟!我浪费了 2 个小时来了解它的包/模块/对象结构。

    另外,pandas.Series.str.split() 基本上是pandas.core.series.Series.str.split()。我就放弃了!

    尝试从 pandas 导入str.split(),你将获得诺贝尔奖!

    【讨论】:

    • pandas.Series.str.split 方法根本不意味着要导入。但是,它对于在 Series 上执行字符串操作非常有用且速度极快。
    • 好吧,OP 想用 pandas 的 str.split 来掩盖 Python 的内置 str.split。但是我已经从 IRC 网络 Freenode 上的 Python 专家那里得到了信息,这是不可能的,所以这个问题浪费了我们的生命。继续……
    猜你喜欢
    • 2021-02-09
    • 2021-08-07
    • 1970-01-01
    • 2019-10-02
    • 2016-08-27
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多