在 python 中合并拆分字符串



我正在 Python 中读取一个 csv 文件,并尝试在其中一列中拆分值,以便我可以解析出某个值。

我的输入如下所示:

ColA
AA_BBB_CCC_DDD
AAA_BBBB_CCC_DDDDDD
AAAA_B_ZZ_CC_DDD
AAA_BBB_CCCC_DDDD

条目将在下划线 (_( 上拆分。使用以下方法

jobs = pd.read_csv(somefile.csv)
jobs["Val1"] = jobs["ColA"].str.split("_",  expand=True)[1]
jobs["Val2"] = jobs["ColA"].str.split("_",  expand=True)[2]
print(jobs["Val1"])
print(jobs["Val2"])

这有效并给我这样的输出 -

0     WRE
1     BBB
2    BBBB
3       B
4     BBB
Name: Val1, dtype: object
0     CMD
1     CCC
2     CCC
3      ZZ
4    CCCC
Name: Val2, dtype: object

我的问题是在某些情况下,下划线实际上是 Val1 的一部分,不应该被删除。如果 Val1 是 2 个字符或更少,则确实需要将 Val1 与 Val2 组合以获得正确的值。

例如,我示例中的第三个条目。Val1 将是"B",而 Val2 将是"ZZ"。由于 Val1 只是一个字符,因此 Val1 的真正值应该是"B_ZZ"。

为了尝试实现这一目标,我正在做以下工作——

if len(jobs["Val1"]) <=2:
jobs["Val1"] = jobs["Val1"] + "_" + jobs["Val2"]

然而,这对我没有任何作用。我得到的结果与根本不包括它的结果相同。

如果我将 <= 值更改为 5(这肯定是不正确的(,它会进行合并。但是,它对所有值都这样做,输出看起来像这样 -

0     WRE_CMD
1     BBB_CCC
2    BBBB_CCC
3        B_ZZ
4    BBB_CCCC
Name: Val1, dtype: object
0     CMD
1     CCC
2     CCC
3      ZZ
4    CCCC
Name: Val2, dtype: object

我不确定我在这里错过了什么。或者,如果有更好的方法来实现我想要实现的目标。

对不起,冗长的笔记。

谢谢

你在哪里尝试这个:

if len(jobs["Val1"]) <=2:
jobs["Val1"] = jobs["Val1"] + "_" + jobs["Val2"]

相反,您可以传递一个函数,该函数通过apply

def adjust_val1(row):
if len(row['val1']) <= 2:
return row['val1'] + '_' + row['val2']
else:
return row['val1']

然后

jobs['val3'] = jobs.apply(adjust_val1, axis=1)

您可以将df['ColA'].str.split与负面的正则表达式一起使用:

df['ColA'].str.split(r'(?<!_[A-Za-z])_', expand=True)
0     1     2       3
0    AA   BBB   CCC     DDD
1   AAA  BBBB   CCC  DDDDDD
2  AAAA  B_ZZ    CC     DDD
3   AAA   BBB  CCCC    DDDD

使用numpy也许这会有所帮助

jobs["Val3"] = np.where(jobs.Val1.str.len()<=2, jobs.Val1+"_"+jobs.Val2, jobs.Val1)
ColA  Val1  Val2  Val3
0       AA_BBB_CCC_DDD   BBB   CCC   BBB
1  AAA_BBBB_CCC_DDDDDD  BBBB   CCC  BBBB
2     AAAA_B_ZZ_CC_DDD     B    ZZ  B_ZZ
3    AAA_BBB_CCCC_DDDD   BBB  CCCC   BBB

我会尝试使用应用方法使用函数:

import pandas as pd
df = pd.DataFrame()
df['col'] = pd.Series(['AA_BBB_CCC_DDD','AAA_BBBB_CCC_DDDDDD','AAAA_B_ZZ_CC_DDD','AAA_BBB_CCCC_DDDD'])
df:
col
0   AA_BBB_CCC_DDD
1   AAA_BBBB_CCC_DDDDDD
2   AAAA_B_ZZ_CC_DDD
3   AAA_BBB_CCCC_DDDD

一个随心所欲拆分的功能:

def get_val1(x):
l = x.split('_')
if len(l[1]) < 2:
return l[1] + '_' + l[2]
else:
return l[1]
df['val1'] = df['col'].apply(lambda x: get_val1(x))

Resultado val1:

0     BBB
1    BBBB
2    B_ZZ
3     BBB
Name: val1, dtype: object
df["val2"] = df["col"].str.split("_",  expand=True)[2]

结果:

col                 val1    val2
0   AA_BBB_CCC_DDD      BBB     CCC
1   AAA_BBBB_CCC_DDDDDD BBBB    CCC
2   AAAA_B_ZZ_CC_DDD    B_ZZ    ZZ
3   AAA_BBB_CCCC_DDDD   BBB     CCCC

最新更新