根据值拆分列并创建新数据帧

2024-10-04 03:17:42 发布

您现在位置:Python中文网/ 问答频道 /正文

是否需要有关特定csv文件导入的帮助,并希望根据其中的值将最后一列拆分为其他几列;)

csv示例:

timestamp;event;resultid;docid;message
12/05/2021;search;86CE8D1E1D8B49B09B646F173E9E7A1A;pdf01;{valuea1|valueb1|valuec1/valued1/}
11/05/2021;search;1672D80B8619420997B4F2DC81872F67;pdf02;{valuea2|valueb2|valuec2/valued2/}
10/05/2021;search;7E353C85FC984B33861801676121133B;pdf03;{valuea3|valueb3|valuec3/valued3/}{valuea4|valueb4|valuec4/valued4/}
  1. 最后一列值在{}字符内,有时超过1{}
  2. 第一个分割值应予以考虑
  3. 最后是/

我几乎知道如何通过拆分值来添加新列(例如使用| splits caracter),但不知道如何添加其他行(如果特定的值在中)

最后,我想要一个这样的数据帧

timestamp;event;resultid;docid;valuea;valueb;valuec;valued
12/05/2021;search;86CE8D1E1D8B49B09B646F173E9E7A1A;pdf01;valuea1;valueb1;valuec1;valued1
11/05/2021;search;1672D80B8619420997B4F2DC81872F67;pdf02;valuea2;valueb2;valuec2;valued2
10/05/2021;search;7E353C85FC984B33861801676121133B;pdf03;valuea3;valueb3;valuec3;valued3
10/05/2021;search;7E353C85FC984B33861801676121133B;pdf03;valuea4;valueb4;valuec4;valued4

最后两行已被复制,因为最后一列有多个{}


Tags: csveventsearchtimestampdocidresultidvalueb2valuea2
2条回答

尝试:

df2 = (
    df1.assign(message=df1.message.str.replace('/', '|').str.replace('}{', '},{').str.split(',')
               ).explode('message')
)
df2[['valuea', 'valueb', 'valuec', 'valued']] = df2.message.str.lstrip(
    '{').str.rstrip('|}').str.split('|', expand=True)

首先,您可以使用.str.findall()查找每个括号中的所有值,并将它们作为列表返回

然后您可以使用.str.split()中的|语法在多个分隔符上拆分

最后使用drop删除message

df_ = df.assign(message=df['message'].str.findall(r'{(.*?)}')).explode('message')

df_[['valuea', 'valueb', 'valuec', 'valued']] = df_['message'].str[:-1].str.split('\||/',expand=True)

df_ = df_.drop(['message'], axis=1)
print(df_)

    timestamp   event                          resultid  docid   valuea   valueb   valuec   valued
0  12/05/2021  search  86CE8D1E1D8B49B09B646F173E9E7A1A  pdf01  valuea1  valueb1  valuec1  valued1
1  11/05/2021  search  1672D80B8619420997B4F2DC81872F67  pdf02  valuea2  valueb2  valuec2  valued2
2  10/05/2021  search  7E353C85FC984B33861801676121133B  pdf03  valuea3  valueb3  valuec3  valued3
2  10/05/2021  search  7E353C85FC984B33861801676121133B  pdf03  valuea4  valueb4  valuec4  valued4

要导出为csv,可以使用

df_.to_csv('your.csv', index=False)

相关问题 更多 >