pandas extract()返回空数据框



你能帮我一下吗?

我有一个数据帧分割()的结果[我相信是一个数据帧,每一行是一个列表?像这样:

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个字符的块可以根据需要重复多次。

我还将00dd{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

相关内容

  • 没有找到相关文章

最新更新