【发布时间】:2021-03-10 19:19:40
【问题描述】:
我想根据以下规则通过名称建立值之间的关系:
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-father & B02-father & ... 相互之间没有任何影响,而且它们都有各自的路要走,所以对于每条路,我们都会从上面提到的起点开始。 父亲.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-Father 存在所以它是父亲,现在我们将搜索任何以 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
我用 pandas 将其编码如下:
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')
我想将下面的代码放在一个循环中,并根据命名过程检查文件并检查其他父亲和婴儿,直到完成。但是,此代码不是自定义的,并且没有我预期的确切结果。 我的问题是关于如何制作循环?
我应该通过路径并考虑任何字符串的regstr 值。
#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')
【问题讨论】:
-
您说
Now I have another CSV file which let me know from which value I should start? in this case the value,但您也可以处理数据以获得您想要的结果,而无需获取开始的值。确实如此,这将非常简单,并且只需很短的代码即可完成 - 如果是,请确认。 -
我没有明白这一点,但你应该有一个路径的起点。根据起点,您可以找到前进的方向。这是非常重要的原因,因为您看到 A0-N-A2-M 和 A2-M-A0-N 都存在,当您从 A0 开始时,您接受 A0-N-A2-M 是婴儿。但是当你作为父亲去 A2 时,你不接受 A2-M-A0-N 作为孩子。由于A0一直是父亲。由于这个原因,我要求从一条路径开始。这正是我正在处理的问题。
-
这是什么意思:A05-NA?
标签: python python-3.x regex pandas numpy