首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Pandas Dataframe - Python对母子数据进行分组

使用Pandas Dataframe - Python对母子数据进行分组
EN

Stack Overflow用户
提问于 2019-04-07 11:02:04
回答 1查看 2.4K关注 0票数 0

我有一个数据框架,我想根据同一数据帧中另一列的值对其进行分组。

例如:

Parent_ID和子ID是链接的,并在层次树中定义了与谁相关的人。

数据文件看起来像(来自csv文件的输入)

代码语言:javascript
运行
复制
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()函数。

代码语言:javascript
运行
复制
Alfred
  |_ Galie
   _ Tom
   _ Marvela
       |_ Remo
        _ Armin
Carmen
Katya
  |_ Boris

而且,我希望在相同的数据框架中创建一个新列,它将有一个标记来指示层次结构。比如:

代码语言:javascript
运行
复制
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文件。

最后的输出是

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-07 12:36:10

为此,我将编写一个递归函数。

首先,创建{id:name}{parent:id}和递归函数的字典。

代码语言:javascript
运行
复制
id_name_dict = dict(zip(df.ID, df.Name))
parent_dict = dict(zip(df.ID, df.Parent_Id))

def find_parent(x):
    value = parent_dict.get(x, None)
    if value is None:
        return ""
    else:
        # Incase there is a id without name.
        if id_name_dict.get(value, None) is None:
            return "" + find_parent(value)

        return str(id_name_dict.get(value)) +", "+ find_parent(value)

然后用Series.apply创建新列,用Series.str.strip删除', '

代码语言:javascript
运行
复制
df['Tag'] = df.ID.apply(lambda x: find_parent(x)).str.rstrip(', ')

df

   No     Name   ID  Parent_Id              Tag
0   1      Tom  211        111           Alfred
1   2    Galie  209        111           Alfred
2   3     Remo  200        101  Marvela, Alfred
3   4   Carmen  212        121                 
4   5   Alfred  111        191                 
5   6  Marvela  101        111           Alfred
6   7    Armin  234        101  Marvela, Alfred
7   8    Boris  454        109            Katya
8   9    Katya  109        323                 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55558255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档