我有一个数据框架,我想根据同一数据帧中另一列的值对其进行分组。
例如:
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
发布于 2019-04-07 12:36:10
为此,我将编写一个递归函数。
首先,创建{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
https://stackoverflow.com/questions/55558255
复制相似问题