python - 如何在 pandas 中多次提取字符串中存在的单个模式

标签 python pandas

我有以下数据

Description
4 GB+ 2 GB Night 3G/2G Data
Unlimited Local & STD Calls + 500 MB 3G/2G Data (T&C apply)
9GB + 8GB night data+ 6GB next night data
8 GB data 4G

我想要的是提取大量数据(4GB 等)并将它们合并到单个列中

df2=df['Description'].str.extract('([0-9]+(\.[0-9][0-9]?)?\s?GB|[0-9]+(\.[0-9][0-9]?)?\s?MB)')

我也使用过pandas函数extractall(),但是extractextractall()都给了我这样的结果

0     1    2
4GB   Nan  Nan     #2 gb is missing
500MB Nan  Nan   
9GB   Nan  Nan     # 8gb 6 gb is missing
8Gb   Nan  Nan

我哪里错了? 此外,当将行与 df.fillna(' ') 组合时,我得到这样的输出

     0 
    4GB,2GB, 
    500MB, , 
    9GB,8GB,6GB
    8GB, , 

虽然我想要的是

0
4GB,2GB
500MB
9GB,8GB,6GB
8GB

我不需要空格。pandas 有没有办法获取上述格式的数据?我是python初学者,不知道如何实现这一点。如果有其他方法请提及。

编辑:

这是完整的代码:

df2=df['Description'].str.extractall('([0-9]+(\.[0-9][0-9]?)?\s?GB|[0-     9]+(\.[0-9][0-9]?)?\s?MB)')
#print df2
df2[1].fillna("",inplace=True);
df2[2].fillna("",inplace=True)
print df2
df3=df2[0]+','+df2[1]+','+df2[2];
print df3

最佳答案

使用 extractall 应该像下面这样工作:

df.Description.str\
  .extractall('(\d*\s?[GM]B)').groupby(level=0)\
  .apply(lambda x: ','.join(x[0])\
  .replace(' ',''))
Out[75]: 
0        4GB,2GB
1          500MB
2    9GB,8GB,6GB
3            8GB
dtype: object

关于python - 如何在 pandas 中多次提取字符串中存在的单个模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44544731/

相关文章:

javascript - 刷新页面 Ajax Flask Web 应用程序

python - 如何创建嵌套列表并在每个嵌套中放置特定数量的元素?列表和它的嵌套元素总是不一样的

python - 如何让 FactoryBoy 的 ImageField 在调用 save() 之前生成图像?

Python:如何读取列数不均匀的数据文件

python - 将 Series 平铺到给定数组

python - 从 pandas 列中提取对象属性

python - 获取特定列的列名

python - 根据条件删除行组

python - 如何计算列中类型为 str 的行相对于其类别的出现次数?

python - Tkinter 对话框 showinfo 循环错误