[英]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)]
然后使用apply
从body
创建一个新的数据框
>>> 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.