我有一个数据框,我想根据同一数据框中另一列的值进行分组。
例如:
Parent_ID和子ID是链接的,用于定义与层次树中的人员相关的人员。
数据框看起来像(从csv文件输入)
No Name ID Parent_Id
1 Tom 211 111
2 Galie 209 111
3 Remo 200 101
4 Carmen 212 121
5 Alfred 111 191
6 Marvela 101 111
7 Armin 234 101
8 Boris 454 109
9 Katya 109 323
我想根据以下分组中的ID和Parent_ID对此数据框进行分组,并根据顶级父级生成CSV文件。即,Alfred.csv,Carmen.csv(将只有自己的条目,冰线#4),Katya.csv使用to_csv()函数。
Alfred
|_ Galie
_ Tom
_ Marvela
|_ Remo
_ Armin
Carmen
Katya
|_ Boris
而且,我想在同一个数据框中创建一个新列,它将有一个标记指示层次结构。喜欢:
No Name ID Parent_Id Tag
1 Tom 211 111 Alfred
2 Galie 209 111 Alfred
3 Remo 200 101 Marvela, Alfred
4 Carmen 212 121
5 Alfred 111 191
6 Marvela 101 111 Alfred
7 Armin 234 101 Marvela, Alfred
8 Boris 454 109 Katya
9 Katya 109 323
请注意,名称可以重复,但ID将是唯一的。
请告诉我如何使用熊猫实现这一目标。我尝试了groupby(),但似乎有点复杂,没有得到我想要的。每个父级应该有一个文件,子级记录在父文件中。如果孩子有其他孩子(如奇迹),它有资格拥有自己的csv文件。
而最终的输出将是
Alfred.csv - All records matching Galie, Tom, Marvela
Marvela.csv - All records matching Remo, Armin
Carmen.csv - Only record matching carmen (row)
Katya.csv - all records matching katya, boris
我假设你的数据帧是一个字典:
mydf = ({"No":[1,2,3,4,5,6,7,8,9],"Name":["Tom","Galie","Remo","Carmen","Alfred","Marvela","Armin","Boris","Katya"],
"ID":[211,209,200,212,111,101,234,454,109],"Parent_Id":[111,111,101,121,191,111,101,109,323]})
df = pd.DataFrame(mydf)
然后,我从每一行识别出Parent_Id
。最后将它们存储到新列中:
tag = []
for z in df['Parent_Id']:
try:
tag.append(df.query('ID==%s'%z)['Name'].item())
except:
tag.append('')
df['Tag'] = tag
要根据Tag
列中的值过滤数据框,例如Alfred
:
df[df['Tag'].str.match('Alfred')]
然后将其保存在csv
文件中。重复其他值。或者,如果列Tag
中有大量名称,则使用for
循环。