需要您帮助导入特定的 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/}
我几乎知道如何通过拆分值来添加新列(例如使用 | 拆分字符),但不知道如何添加其他行(如果有特定值)。
最后我想要一个这样的数据框
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
最后两行重复,因为最后一列有多个{}
答案 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)