【问题标题】:Grouping Herarchical Parent-Child data using Pandas Dataframe - Python使用 Pandas Dataframe 对 Herarchical Parent-Child 数据进行分组 - Python
【发布时间】:2019-04-07 20:36:10
【问题描述】:

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

例如:

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 文件。即 Alfred.csv、Carmen.csv(将只有自己的条目,冰线 #4)、使用 to_csv() 函数的 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 是唯一的。

请告诉我如何使用 pandas 来实现这一点。我尝试了 groupby() 但似乎有点复杂并且没有得到我想要的。每个父级应该有一个文件,子级记录在父级文件中。 如果一个孩子有另一个孩子(如 marvel),它就有资格拥有自己的 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

【问题讨论】:

    标签: python pandas dataframe hierarchy


    【解决方案1】:

    我会写一个递归函数来做到这一点。

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

    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 删除', '

    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                 
    

    【讨论】:

    • 感谢 ResidentSleeper!看起来是这样的。但是,我遇到了 setcopy:SettingWithCopyWarning 错误:试图在 DataFrame 的切片副本上设置一个值。尝试改用 .loc[row_indexer,col_indexer] = value 查看文档中的警告:pandas.pydata.org/pandas-docs/stable/… df['Tag'] = df.ID.apply(lambda x: find_parent(x)).str.rstrip(', ')
    • @sidman 也许你的df 是一个切片的副本。您可以尝试df = df.copy before 或df.loc[:, 'Tag'] = df.ID.apply(lambda x: find_parent(x)).str.rstrip(', ')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2014-05-15
    • 2013-12-06
    • 2018-04-13
    • 2018-03-12
    • 2017-12-30
    • 1970-01-01
    相关资源
    最近更新 更多