根据值拆分列并创建新的数据框

时间:2021-05-12 08:28:30

标签: python pandas

需要您帮助导入特定的 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. 最后是 /

我几乎知道如何通过拆分值来添加新列(例如使用 | 拆分字符),但不知道如何添加其他行(如果有特定值)。

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

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

最后两行重复,因为最后一列有多个{}

2 个答案:

答案 0 :(得分:0)

尝试:

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)

答案 1 :(得分:-1)

首先,您可以使用 .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)