我有以下每行值的列表。我想将这些值分成不同的类别并创建单独的列。
其中一些值属于同一类别。所以我需要把它们按列分类
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预期产出
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。
可能是我有一个与字符串关联的未知前缀/后缀。但是,每个分类值都由;分隔。
所以我有点搞不懂如何把这些不同的操作结合起来。
发布于 2022-11-05 18:00:19
根据你提供的数据:
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",
]
}
)有一种方法可以做到:
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然后:
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)因此:
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 1https://stackoverflow.com/questions/74270758
复制相似问题