我想根据以下规则按名称建立值之间的关系:
1-我有一个CSV文件(超过100000行),其中包含许多值,我分享了以下示例:
Name:
A02-father
A03-father
A04-father
A05-father
A07-father
A08-father
A09-father
A17-father
A18-father
A20-father
A02-SA-A03-SA
A02-SA-A04-SA
A03-SA-A02-SA
A03-SA-A05-SA
A03-SA-A17-SA
A04-SA-A02-SA
A04-SA-A09-SA
A05-SA-A03-SA
A09-SA-A04-SA
A09-SA-A20-SA
A17-SA-A03-SA
A17-SA-A18-SA
A18-SA-A17-SA
A20-SA-A09-SA
A05-NA
B02-Father
B04-Father
B06-Father
B02-SA-B04-SA
B04-SA-BO2-SA
B04-SA-B06-SA
B06-SA-B04-SA
B06-NA
2-现在我有另一个CSV文件,它让我知道应该从哪个值开始?在本例中,值为 A03父亲与母亲;B02父亲与。。。它们相互之间没有任何影响,它们都有各自的路径,所以对于每一条路径,我们将从所提到的起点开始。 父亲.csv A03父亲 B02父亲 ....
3-基于我想要建立关系的命名,因为A03父亲已被确定为父亲,我应该检查以A03开始的任何值。(所有这些都是A0的婴儿。) 同样由于B02是父级,我们将检查以B02开头的任何值。(B02-SA-B04-SA)
4-现在如果我发现A03-SA-A02-SA,这是A03的孩子。 我发现A03-SA-A05-SA,这是A03的宝宝。 我发现A03-SA-A17-SA,这是A03的宝宝
然后我必须检查任何以A02&;开头的节点;A05&;A17: 正如您所看到的,A02父亲存在,因此它是父亲,现在我们将搜索任何以A02开头且没有被检测为父亲的A03的字符串(必须忽略)
必须检查此项,直到CSV文件中存在的值结束。 正如您所看到的,我应该根据名称(REGEX)检查路径,并且应该一直前进到路径的末尾
预期结果:
Father Baby
A03-father A03-SA-A02-SA
A03-father A03-SA-A05-SA
A03-father A03-SA-A17-SA
A02-father A02-SA-A04-SA
A05-father A05-NA
A17-father A17-SA-A18-SA
A04-father A04-SA-A09-SA
A02-father A02-SA-A04-SA
A09-father A09-SA-A20-SA
B02-father B02-SA-B04-SA
B04-father B04-SA-B06-SA
B06-father B06-NA
我用熊猫将其编码如下:
import pandas as pd
import numpy as np
import re
#Read the file which consists of all Values
df = pd.read_csv("C:\\total.csv")
#Read the file which let me know who is father
Fa = pd.read_csv("C:\\Father.csv")
#Get the first part of Father which is A0
Fa['sub'] = Fa['Name'].str.extract(r'(\w+\s*)', expand=False)
r2 = []
#check in all the csv file and find anything which starts with A0 and is not Father
for f in Fa['sub']:
baby=(df[df['Name'].str.startswith(f) & ~df['Name'].str.contains('Father')])
baby['sub'] = bay['Name'].str.extract(r'(\w+\s*)', expand=False)
r1= pd.merge(Fa, baby, left_on='sub', right_on='sub',suffixes=('_f', '_c'))
r2.append(result1)
out_df = pd.concat(result2)
out_df= out_df.replace(np.nan, '', regex=True)
#find A0-N-A2-M and A0-N-A4-M
out_df.to_csv('C:\\child1.csv')
#check in all the csv file and find anything which starts with the second part of child1 which is A2 and A4
out_df["baby2"] = out_df['Name_baby'].str.extract(r'^(?:[^-]*-){2}\s*([^-]+)', expand=False)
baby3= out_df["baby2"]
r4 = []
for f in out_df["baby2"]:
#I want to exclude A0 which has been detected.
l = ['A0']
regstr = '|'.join(l)
baby1=(df[df['Name'].str.startswith(f) & ~df['Name'].str.contains(regstr)])
baby1['sub'] = baby1['Name'].str.extract(r'(\w+\s*)', expand=False)
r3= pd.merge(baby3, baby1, left_on='baby2', right_on='sub',suffixes=('_f', '_c'))
r4.append(r3)
out2_df = pd.concat(r4)
out2_df.to_csv('C:\\child2.csv')
我想把下面的代码放在一个循环中,根据命名过程检查文件,并检测其他父亲和婴儿,直到完成。然而,这段代码不是定制的,也没有我预期的准确结果。 我的问题是关于如何进行循环
<强>我应该遍历路径,也考虑任何字符串的{{CD1>}值。< /强>
#check in all the csv file and find anything which starts with the second part of child1 which is A2 and A4
out_df["baby2"] = out_df['Name_baby'].str.extract(r'^(?:[^-]*-){2}\s*([^-]+)', expand=False)
baby3= out_df["baby2"]
r4 = []
for f in out_df["baby2"]:
#I want to exclude A0 which has been detected.
l = ['A0']
regstr = '|'.join(l)
baby1=(df[df['Name'].str.startswith(f) & ~df['Name'].str.contains(regstr)])
baby1['sub'] = baby1['Name'].str.extract(r'(\w+\s*)', expand=False)
r3= pd.merge(baby3, baby1, left_on='baby2', right_on='sub',suffixes=('_f', '_c'))
r4.append(r3)
out2_df = pd.concat(r4)
out2_df.to_csv('C:\\child2.csv')
注释内联
测试用例:
输出:
编辑1:
从一些测试数据开始
首先,让我们创建一个数据结构,这样操作会很容易,查找关系会很快,因为您有大量数据
输出:
如您所见
all_fathers
包含所有父项,最重要的是all_relations
包含父子关系,可以使用father
对父子关系进行索引,以便更快地查找让我们如何对关系进行实际解析
输出:
编辑2:
新的测试用例;[您必须将father.csv中的值加载到名为
father
的列表中]输出:
从
import collections
开始(很快就会需要)我假设您已经阅读了df和Fa数据帧
我的代码的第一部分是创建子系列(index-parent, 值(子项):
打印子对象以查看结果
第二部分是创建实际结果,从每个 Fa中的起点:
我用小写字母“f”添加了-father,但我认为这并不多 重要的细节
对于您的数据样本,结果是:
关于您的数据样本,请注意以下两点:
A02-father A02-SA-A04-SA
加倍。 我想这应该只发生一次李>相关问题 更多 >
编程相关推荐