pandas 如何将一列拆分为多列并给列给予标记?

uidvcgyl  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(145)

下面是一个数据框:

+---------+
|    Value|
+---------+
|X1A14    |
|X20P79   |
|A50B7P60 |
|G24C5C6B8|
+---------+

value列中的项目没有固定的长度。例如,X1A14由两个字组成,分别为X1A14A50B7P60分别为A50B7P60
我想拆分每个字符,但我需要保留字符,如下所示:

+---------+---+---+---+--+
|    Value|  A|  B|  C| D|
+---------+---+---+---+--+
|X1A14    |X1 |A14|   |  |
|X20P79   |X20|P79|   |  |
|A50B7P60 |A50|B7 |P60|  |
|G24C5C6B8|G24|C5 |C6 |B8|
+---------+---+---+---+--+

最后,我想为每一栏做一个标记。我不能确定有多少栏,因为最后有四个词要合并成一个项目,所以在这种情况下我们有四栏要标记。
以下是最终输出:

+---------+---+-----+---+-----+---+-----+--+-----+
|    Value|  A|mark1|  B|mark2|  C|mark3| D|mark4|
+---------+---+-----+---+-----+---+-----+--+-----+
|X1A14    |X1 |    A|A14|    B|   |    C|  |    D|
|X20P79   |X20|    A|P79|    B|   |    C|  |    D|
|A50B7P60 |A50|    A|B7 |    B|P60|    C|  |    D|
|G24C5C6B8|G24|    A|C5 |    B|C6 |    C|B8|    D|
+---------+---+-+---+---+-----+---+-----+--+-----+

我试过split函数,但它不能保持单词delimeter离开。

mklgxw1f

mklgxw1f1#

我假设您正在尝试匹配以大写字符开头并在下一个大写字符或字符串结尾之前结束的每个子字符串。
可以将extractall与正则表达式模式([A-Z][0-9]+)一起使用,如下所示

import pandas as pd

# sample data
df = pd.DataFrame({
    'value': ['X1A14','X20P79','A50B7P60','G24C5C6B8']
})

# extract
extractions = df['value'].str.extractall('([A-Z][0-9]+)')

# reshape
extractions['mark'] = extractions.index.get_level_values(1).values
extractions = extractions.rename(columns={0: 'value'}).unstack().swaplevel(axis=1).sort_index(axis=1)
extractions.columns = [col[0] if col[1]=='group' else col[1]+str(col[0]) for col in extractions.columns.values]

# append to original data
pd.concat([df, extractions], axis=1)

这导致了

value  mark0 value0  mark1 value1  mark2 value2  mark3 value3
0      X1A14    0.0     X1    1.0    A14    NaN    NaN    NaN    NaN
1     X20P79    0.0    X20    1.0    P79    NaN    NaN    NaN    NaN
2   A50B7P60    0.0    A50    1.0     B7    2.0    P60    NaN    NaN
3  G24C5C6B8    0.0    G24    1.0     C5    2.0     C6    3.0     B8

这与您预期的结果略有不同,因为它使用数字标识符而不是字符来标识每个匹配项。您没有指定列value中是否有可变数量的子字符串(假定这只是您的数据的摘录),因此这可能更可靠。

相关问题