我正在 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