我有一个如下所示的字符串列表
orig = ["a1 2.3 ABC 4 DEFG 567 b890",
"a2 3.0 HI 4 5 JKL 67 c65",
"b1 1.2 MNOP 3 45 67 89 QR 987 d64 e112"]
这里的上下文是,这是一个 CSV 文件,并且省略了某些列。我认为 pandas csv 阅读器无法处理这些情况。现在的想法是为缺失值注入(inject) na
,因此输出变为
corr = ["a1 2.3 ABC 4 na na na DEFG 567 b890",
"a2 3.0 HI 4 5 na na JKL 67 c65",
"b1 1.2 MNOP 3 45 67 89 QR 987 d64 e112"]
稍后在导入 pandas 时将第二列与大写单词对齐。
结构如下:列之间的分隔符是两个或多个空格,两个大写列之间必须有四个值。在原始文件中,始终只有两个大写列,它们之间至少有 1 个、最多 4 个数字,并且这些大写单词之间只有数值。
我可以毫无问题地用原生 Python 编写脚本,所以请不要对此提出建议。但我想,这可能是正则表达式的情况。作为正则表达式初学者,我只能使用
for line in orig:
a = re.findall("([A-Z]+[\s\d]+[A-Z]+)", line))
print(a)
>>>'ABC 4 DEFG' #etc pp
正则表达式中现在是否有一种简单的方法来确定大写单词之间有多少个数字并插入“na”值以使其之间始终有四个值?或者我应该用原生 Python 来做?
当然,如果有办法用 pandas csv reader 来做到这一点,那就更好了。但我研究了pandas csv_reader docs并没有发现任何有用的东西。
最佳答案
基于完整的 pandas 方法拆分和连接可能会有所帮助,即
ndf = pd.Series(orig).str.split(expand=True)
# 0 1 2 3 4 5 6 7 8 9 10
#0 a1 2.3 ABC 4 DEFG 567 b890 None None None None
#1 a2 3.0 HI 4 5 JKL 67 c65 None None None
#2 b1 1.2 MNOP 3 45 67 89 QR 987 d64 e112
df = pd.concat([ndf.iloc[:,:4], ndf.iloc[:,4:].apply(sorted,key=pd.notnull,axis=1)],1)
df.astype(str).apply(' '.join,axis=1).tolist()
['a1 2.3 ABC 4 None None None None DEFG 567 b890',
'a2 3.0 HI 4 None None None 5 JKL 67 c65',
'b1 1.2 MNOP 3 45 67 89 QR 987 d64 e112']
关于python - 使用正则表达式或常规 Python 进行字符串替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48476521/