【发布时间】: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