Python 例如,根据列中的层次结构值追加数据
试图找到一个合适的pandas代码以优化的方式执行此操作(需要处理数百万行) 输入数据框看起来像Python 例如,根据列中的层次结构值追加数据,python,pandas,lambda,pandas-groupby,Python,Pandas,Lambda,Pandas Groupby,试图找到一个合适的pandas代码以优化的方式执行此操作(需要处理数百万行) 输入数据框看起来像 levels value 0 5.1 X 1 5.1.1 Y 2 5.1.1.1 Y1 3 5.1.2 Z 4 5.2 A 5 5.2.2 B 6 5.2.2.1 C 7 5.2.2.2 D 输出数据帧应该是 levels value newValue 0 5.1
levels value
0 5.1 X
1 5.1.1 Y
2 5.1.1.1 Y1
3 5.1.2 Z
4 5.2 A
5 5.2.2 B
6 5.2.2.1 C
7 5.2.2.2 D
输出数据帧应该是
levels value newValue
0 5.1 X X,Y,Y1,Z
1 5.1.1 Y Y,Y1
2 5.1.1.1 Y1 Y1
3 5.1.2 Z Z
4 5.2 A A,B,C,D
5 5.2.2 B B,C,D
6 5.2.2.1 C C
7 5.2.2.2 D D
附加值的规则是,当您看到一个级别时,将其值附加到与“^{level}”匹配的所有子级别。例如,如果是级别5.2.2,则附加与r“^5.2.2*”匹配的所有行。如果级别为5.2。然后追加与r“^5.2*”匹配的所有行
有什么建议吗?这样做是为了积累水平。也应该适用于扩展级别
df.reset_index(inplace=True)
ml = df.levels.str.len().max()
l = []
for i in range(3, ml+1, 2):
df1 = df.groupby(df.levels.str[:i])['value'].apply(list)
l.append(pd.merge(df[['index','levels']], df1, on='levels'))
df = df[~df.levels.isin(df1.index)]
pd.concat(l).sort_values('index').set_index('index')
输出
levels value
index
0 5.1 [X, Y, Y1, Z]
1 5.1.1 [Y, Y1]
2 5.1.1.1 [Y1]
3 5.1.2 [Z]
4 5.2 [A, B, C, D]
5 5.2.2 [B, C, D]
6 5.2.2.1 [C]
7 5.2.2.2 [D]
这不影响水平的积累。也应该适用于扩展级别
df.reset_index(inplace=True)
ml = df.levels.str.len().max()
l = []
for i in range(3, ml+1, 2):
df1 = df.groupby(df.levels.str[:i])['value'].apply(list)
l.append(pd.merge(df[['index','levels']], df1, on='levels'))
df = df[~df.levels.isin(df1.index)]
pd.concat(l).sort_values('index').set_index('index')
输出
levels value
index
0 5.1 [X, Y, Y1, Z]
1 5.1.1 [Y, Y1]
2 5.1.1.1 [Y1]
3 5.1.2 [Z]
4 5.2 [A, B, C, D]
5 5.2.2 [B, C, D]
6 5.2.2.1 [C]
7 5.2.2.2 [D]
你可以用列表理解来完成这一行。本质上,您可以将所有
值
返回到一个列表中,其中级别
是另一行的每行级别
的子字符串
df['value_list'] = df.apply(lambda x: [z for y,z in zip(df['levels'], df['value']) if x['levels'] in y], axis=1)
df
Out[1]:
levels value value_list
0 5.1 X [X, Y, Y1, Z]
1 5.1.1 Y [Y, Y1]
2 5.1.1.1 Y1 [Y1]
3 5.1.2 Z [Z]
4 5.2 A [A, B, C, D]
5 5.2.2 B [B, C, D]
6 5.2.2.1 C [C]
7 5.2.2.2 D [D]
你可以用列表理解来完成这一行。本质上,您可以将所有
值
返回到一个列表中,其中级别
是另一行的每行级别
的子字符串
df['value_list'] = df.apply(lambda x: [z for y,z in zip(df['levels'], df['value']) if x['levels'] in y], axis=1)
df
Out[1]:
levels value value_list
0 5.1 X [X, Y, Y1, Z]
1 5.1.1 Y [Y, Y1]
2 5.1.1.1 Y1 [Y1]
3 5.1.2 Z [Z]
4 5.2 A [A, B, C, D]
5 5.2.2 B [B, C, D]
6 5.2.2.1 C [C]
7 5.2.2.2 D [D]
使用您使用的正则表达式显示分组。生成新值的规则是什么?请提交您的代码。附加值的规则是,当您看到某个级别时,将其值附加到与“^{level}”匹配的所有子级别。例如,如果是级别5.2.2,则附加与r“^5.2.2*”匹配的所有行。我是否回答了您的问题?应该是一个相对简单的一行重新思考后。请通过单击答案旁边的复选标记接受答案作为解决方案。使用您使用的正则表达式显示分组。生成新值的规则是什么?请提交您的代码。附加值的规则是,当您看到某个级别时,将其值附加到与“^{level}”匹配的所有子级别。例如,如果是级别5.2.2,则附加与r“^5.2.2*”匹配的所有行。我是否回答了您的问题?应该是一个相对简单的一行重新思考后。请通过单击答案旁边的复选标记接受答案作为解决方案。