Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 例如,根据列中的层次结构值追加数据_Python_Pandas_Lambda_Pandas Groupby - Fatal编程技术网

Python 例如,根据列中的层次结构值追加数据

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

试图找到一个合适的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     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*”匹配的所有行。我是否回答了您的问题?应该是一个相对简单的一行重新思考后。请通过单击答案旁边的复选标记接受答案作为解决方案。