【问题标题】:Split Column depending on values and create new dataframe根据值拆分列并创建新的数据框
【发布时间】:2021-08-02 14:21:01
【问题描述】:

在导入特定 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

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

【问题讨论】:

  • 您能否分享您当前的代码,以及有关问题所在的更多详细信息?

标签: python pandas


【解决方案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)

【讨论】:

    【解决方案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)
    
    

    【讨论】:

    • 非常感谢 :) 我终于找到了另一种方法...我会尽快发布结果(暂时没有代码)
    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多