繁体   English   中英

根据Python上列的文本长度将数据框的列拆分为多列

[英]Split the column of dataframe into multiple columns according to the text length of column on Python

如何根据每个文本长度的大小将一列熊猫数据框分成多列? 假设块大小为 3,样本数据帧为:

id body
1 abcdefgh
2 xyzk

对于这种情况,我想得到:

id body1 body2 body3
1  abc  def gh
2  xyz  k

我假设我应该能够用类似的东西来处理它: df[['body1','body2', 'body3']] = df['body'].str.split(...

有什么建议?

您可以执行以下操作:

new_values = df['body'].str.findall('.{1,3}')
new_columns = [f'body{num}' for num in range(1, new_values.apply(len).max() +1)]
new_df = pd.DataFrame(data=new_values.tolist(), columns=new_columns)

您还可以根据每列所需的最大字符数定义正则表达式模式:

max_char_per_column = 3
regex_pattern = f".{{1,{max_char_per_column}}}"
new_values = df['body'].str.findall(regex_pattern)

如果您不想要 None,请随意使用.fillna("")您的new_df

请参阅this answer for splitting a string with regex every nth character 每隔n个字符拆分字符串? .

首先定义一个split_chunk函数

def split_chunk(txt, n=3):
    return [txt[i:i+n] for i in range(0, len(txt), n)]

然后使用applybody创建一个新的数据框

>>> df2 = pd.DataFrame(df.body.apply(split_chunk).to_list())
>>> df2
     0    1     2
0  abc  def    gh
1  xyz    k  None

您可以替换 None 值,并使用以下内容重命名列

>>> df2 = df2.fillna("").rename(columns=lambda x: f"body{x+1}")
>>> df2
  body1 body2 body3
0   abc   def    gh
1   xyz     k

最后,恢复索引

>>> df2.index = df.id
>>> df2
   body1 body2 body3
id
1    abc   def    gh
2    xyz     k

较短的版本

df = df.set_index("id")

df = pd.DataFrame(
         df.body.apply(split_chunk).to_list(), 
         index=df.index
     ).fillna("").rename(columns=lambda x: f"body{x+1}")

尝试这个:

import pandas as pd
df = pd.DataFrame({"body": ["abcdefgh","xyzk"]})
df['body1'] = df['body'].astype(str).str[0:3]
df['body2'] = df['body'].astype(str).str[3:6]
df['body3'] = df['body'].astype(str).str[6:9]
df.drop('body',axis=1,inplace=True)
print(df)

暂无
暂无

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

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