首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫在列中拆分和替换字符串值,并创建二进制编码列。

熊猫在列中拆分和替换字符串值,并创建二进制编码列。
EN

Stack Overflow用户
提问于 2022-11-01 01:58:05
回答 1查看 32关注 0票数 1

我有以下每行值的列表。我想将这些值分成不同的类别并创建单独的列。

其中一些值属于同一类别。所以我需要把它们按列分类

代码语言:javascript
复制
0, Body;TSS1500
1, TSS200
2,
3, 1stExon;3'UTR
4,
5, TSS200;TSS200;TSS200
6, 1stExon;3'UTR
7, TSS1500
8, 1stExon;5'UTR
9, TSS200
10, 5'UTR;1stExon
11, TSS200;TSS200;TSS200
12, TSS1500;1stExon;TSS1500;5'UTR

预期产出

代码语言:javascript
复制
   Body  TSS   UTR   Other
0, 1     1     0      0
1, 0     1     0      0
2, 0     0     0      0 
3, 0     0     0      1
4, 0     0     0      0
5, 0     1     0      0
6, 0     0     1      1
...

我知道我可以使用pd.get_dummies(df.regions.explode()).sum(level=0),但是我的问题是值需要拆分(如果子字符串匹配的话)并进行分类。例如3'UTR和5'UTR = UTR,以及TSS200,TSS1500 = TSS。

可能是我有一个与字符串关联的未知前缀/后缀。但是,每个分类值都由;分隔。

所以我有点搞不懂如何把这些不同的操作结合起来。

EN

回答 1

Stack Overflow用户

发布于 2022-11-05 18:00:19

根据你提供的数据:

代码语言:javascript
复制
df = pd.DataFrame(
    {
        "Values": [
            "Body;TSS1500",
            "TSS200",
            "1stExon;3'UTR",
            "TSS200;TSS200;TSS200",
            "1stExon;3'UTR",
            "TSS1500",
            "1stExon;5'UTR",
            "TSS200",
            "5'UTR;1stExon",
            "TSS200;TSS200;TSS200",
            "TSS1500;1stExon;TSS1500;5'UTR",
        ]
    }
)

有一种方法可以做到:

代码语言:javascript
复制
def func(string, str_list):
    """Helper function.

    Args:
        string: target string.
        str_list: list of strings to look for.

    Returns:
        1 if target string contains one or more string in str_list else 0.

    """
    res = []
    for substring in string.split(";"):
        sub_res = []
        for other_val in str_list:
            if other_val in substring:
                sub_res.append(other_val)
        if not any(sub_res):
            res.append(substring)
    return 1 if res else 0

然后:

代码语言:javascript
复制
str_list = ["Body", "TSS", "UTR"]

for val in str_list:
    df[val] = df["Values"].str.contains(val).astype(int)

df["Other"] = df.apply(lambda x: func(x["Values"], str_list), axis=1)

因此:

代码语言:javascript
复制
print(df)
# Output
                           Values  Body  TSS  UTR  Other
0                    Body;TSS1500     1    1    0      0
1                          TSS200     0    1    0      0
2                   1stExon;3'UTR     0    0    1      1
3            TSS200;TSS200;TSS200     0    1    0      0
4                   1stExon;3'UTR     0    0    1      1
5                         TSS1500     0    1    0      0
6                   1stExon;5'UTR     0    0    1      1
7                          TSS200     0    1    0      0
8                   5'UTR;1stExon     0    0    1      1
9            TSS200;TSS200;TSS200     0    1    0      0
10  TSS1500;1stExon;TSS1500;5'UTR     0    1    1      1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74270758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档