熊猫-根据其他列对列进行分组并将其标记到新列中

时间:2019-04-06 02:36:41

标签: python pandas analytics pandas-groupby

我有一个数据框,希望根据同一数据框中另一列的值进行分组。

例如:

Parent_ID和Child 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文件。即,使用to_csv()函数的Alfred.csv,Carmen.csv(只有其自己的条目,第4行冰),Katya.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

1 个答案:

答案 0 :(得分:0)

我假设您的数据框为字典:

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循环。