如何调用pandas str.split()而不是在str.split()

时间:2017-03-31 10:43:10

标签: python string pandas split

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

例如,在数据框中:

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的新手,我不知道如何调用大熊猫' 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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

由于你的主要问题似乎是如何整合pandas split功能:

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

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

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

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

答案 2 :(得分:0)

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

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

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

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

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

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

尝试从熊猫中导入str.split(),您将获得诺贝尔奖!