繁体   English   中英

如何按字符范围将 pandas dataframe 字符串拆分为单独的行

[英]How to split by range of characters pandas dataframe string into separate rows

你能帮我用下面的代码吗? 我会尽量做到简洁明了。

  1. 这是我的 df 的摘录

在此处输入图像描述

  1. 我用下面的代码构建了它,因为我看到 SB 字符串总是重复 7 个字符(7、14、21 和 28)。

df_split = df_excelsb_melt[df_excelsb_melt['SB'].str.len() > 7] df_split['SB'].str.len().unique()

输出是:

数组([14, 21, 28], dtype=int64)

3)我试图做什么:

explode(df_split.assign(SB=df_split.SB.str.split(range(0,df_split.SB.str.len(),7)),'SB')

输出是:SyntaxError: unexpected EOF while parsing

  1. 代码应该做什么:

在此处输入图像描述

如上所述,代码应该将 SB 列拆分为 7 个字符。

提前致谢。

编辑

使用regex的简单解决方案:

import re
import pandas as pd

data = [{'MOD': 42334,
  'SB': '38-101138-3015',
  'AC': 'AAA',
  'COMPLIANCE': 'NOT INCORPORATED'},
 {'MOD': 43765,
  'SB': '49-300949-3012',
  'AC': 'AAA',
  'COMPLIANCE': 'NOT INCORPORATED'}]

df = pd.DataFrame(data)

df['SB'] = df['SB'].apply(lambda x : re.findall('.{1,7}', x))
df = df.explode('SB')

Output

|   MOD | SB      | AC   | COMPLIANCE       |
|------:|:--------|:-----|:-----------------|
| 42334 | 38-1011 | AAA  | NOT INCORPORATED |
| 42334 | 38-3015 | AAA  | NOT INCORPORATED |
| 43765 | 49-3009 | AAA  | NOT INCORPORATED |
| 43765 | 49-3012 | AAA  | NOT INCORPORATED |

原液

结合df.iterrows()regex

output = []

#Loop through the records
for record in df.to_dict('records'):
    #Find the SB codes with some regex logic
    for x in re.findall('.{1,7}', record['SB']):
        temp = record.copy()
        temp['SB'] = x
        #Append to the output list
        output.append(temp)
        
new_df = pd.DataFrame(output)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM