你能帮我一下吗?
我有一个数据帧分割()的结果[我相信是一个数据帧,每一行是一个列表?像这样:
0 [001, 2491010000, Blah, 99, Blah, Blah, 2,57]
1 [01.01.20, 0048000002, 21.02.20, #176627, #176627, 001, 2491010000, Blah, 89, Blah, 70.418,60]
2 [01.01.20, Blah, 21.02.20, #176627, 001, 2491010000, Blah, 89, Blah, 3.258,67]
我想迭代上面的内容并创建一个新的数据框架,如下所示:
Code Code1 Price
2491010000 99 2,57
2491010000 89 70.418,60
2491010000 89 3.258,67
我使用的代码片段:
t = journal.str.extract(r'00dD{2}(d{10})D+(d{2})D+(d+[,.]d+[,.]d+)',)
t
但t返回为空。我在正则表达式模拟器中测试了正则表达式,似乎工作得很好,所以我怀疑问题在于输入'日志'。
你能告诉我做这件事的正确方法吗?谢谢!您的正则表达式与数据不匹配。我发现了两个问题:
d+[,.]d+[,.]d+
总是想要2个逗号或点,但你的第一行只有1个逗号和0个点00dD{2}(d{10})
期望在3位数字和10位数字之间有2个非数字分隔符,但可能只有一个或超过2个(我不能说,因为我在你的问题中只有分割数据,而不是原始数据)。
我将价格匹配正则表达式更改为(d{,3}(?:.d{3})*,d+)
,如果您不总是期望在小数分隔符之后有数字,您也可以使用(d{,3}(?:.d{3})*(?:,d+)?)
?:
标记非捕获组,因此它们不会被extract 返回- 将千位分隔符与后面的数字放在一起,可以知道它们总是有3个,并且这个4个字符的块可以根据需要重复多次。
我还将00d
到d{10}
分隔符更改为s+
,这意味着任意数量的空白字符。用断行标记b
开始正则表达式还可以确保00d
本身是一个单词,而不是另一个数字的结尾。
>>> journal.str.extract(r'b00ds+(d{10})D+(d{2})D+(d{,3}(?:.d{3})*,d+)')
0 1 2
0 2491010000 99 2,57
1 2491010000 89 70.418,60
2 2491010000 89 3.258,67
您可以在正则表达式中直接命名您的捕获组:
>>> journal.str.extract(r'b00ds+(?P<Code>d{10})D+(?P<Code1>d{2})D+(?P<Price>d{,3}(?:.d{3})*,d+)')
Code Code1 Price
0 2491010000 99 2,57
1 2491010000 89 70.418,60
2 2491010000 89 3.258,67
这可以帮助读者弄清楚每个捕获块的作用,但它也增加了混乱。视个人喜好而定
如果框架不是太大,并且想保持正则表达式较小,您可以尝试:
import pandas as pd
import re
'''
"[001, 2491010000, Blah, 99, Blah, Blah, 2,57]"
"[01.01.20, 0048000002, 21.02.20, #176627, #176627, 001, 2491010000, Blah, 89, Blah, 70.418,60]"
"[01.01.20, Blah, 21.02.20, #176627, 001, 2491010000, Blah, 89, Blah, 3.258,67]"
'''
df = pd.read_csv('df_strings.csv', header=None)
print(df, 'n')
0
0 [001, 2491010000, Blah, 99, Blah, Blah, 2,57]
1 [01.01.20, 0048000002, 21.02.20, #176627, #176...
2 [01.01.20, Blah, 21.02.20, #176627, 001, 24910...
def getValues(x):
code = re.search(r'(d{10})', x).group(1)
code1 = re.search(r's(d{2}),', x).group(1)
price = re.search(r'(d+,d+)', x).group(1)
price = price.replace(',', '.')
return pd.Series([code, code1, price])
df[['code', 'code1', 'price']] = df.apply(lambda x: getValues(x[0]), axis=1)
print(df[['code', 'code1', 'price']])
code code1 price
0 2491010000 99 2.57
1 0048000002 89 418.60
2 2491010000 89 258.67