python - 如何将一个包含 JSON 值的 CSV 列转换为 4 个不同的列?
问题描述
我有一个名为 Parsing.csv 的 CSV,其内容显示如下
userid data_to_parse
54f3ad9a29ada "value":"N;U;A7;W"}]
54f69f2de6aec "value":"N;U;I6;W"}]
54f650f004474 "value":"Y;U;A7;W"}]
54f52e8872227 "value":"N;U;I1;W"}]
54f64d3075b72 "value":"Y;U;A7;W"}]
54f69dc01793f "value":"N;U;A1;W"}]
54f5d26833ce6 "value":"N;U;A1;W"}]
54f52b1a7e647 "value":"N;U;A4;W"}]
54f4ae7da8d01 "value":"N;U;A1;W"}]
54f6290ca187d "value":"N;U;U;W"}]
我已经阅读了这个数据框
Parsing = pd.read_csv("data/Parsing.csv")
现在我想将值(存储在“data_to_parse”列中)解析为四个单独的列。
例如,第一个条目的四个附加列的值将是“N”、“you”、“A7”和“W”。这些数据基本上来自 JSON blob。我怎样才能实现它?
试过了,但它给了我一个错误,说它不能在 pandas 属性错误中识别 JSON
v=pd.io.json.json_normalize
(Parsing.data_to_parse.apply(pd.json.loads).tolist())
预期输出:具有不同列的数据框中的第一个条目将如下 -
userid | value1| value2| value3| value4
54f3ad9a29ada | N | U | A7 | W
解决方案
IIUC,一种方法是使它们成为正确的json
并使用pandas.Series.str.split
:
s = ("{" + df["data_to_parse"].str.strip("]")).apply(pd.io.json.loads)
df2 = s.str["value"].str.split(";", expand=True)
new_df = pd.concat([df, df2.add_prefix("value")], axis=1)
print(new_df)
输出:
userid data_to_parse value0 value1 value2 value3
0 54f3ad9a29ada "value":"N;U;A7;W"}] N U A7 W
1 54f69f2de6aec "value":"N;U;I6;W"}] N U I6 W
2 54f650f004474 "value":"Y;U;A7;W"}] Y U A7 W
3 54f52e8872227 "value":"N;U;I1;W"}] N U I1 W
4 54f64d3075b72 "value":"Y;U;A7;W"}] Y U A7 W
5 54f69dc01793f "value":"N;U;A1;W"}] N U A1 W
6 54f5d26833ce6 "value":"N;U;A1;W"}] N U A1 W
7 54f52b1a7e647 "value":"N;U;A4;W"}] N U A4 W
8 54f4ae7da8d01 "value":"N;U;A1;W"}] N U A1 W
9 54f6290ca187d "value":"N;U;U;W"}] N U U W
推荐阅读
- android - 低功耗蓝牙广告
- three.js - THREE.ObjLoader 从 .obj 文件生成重复网格
- c# - 保存信息列表时防止用户错误
- angular - 在 Angular 5 中动态添加生命周期方法
- css - Vis.js 组背景样式
- html - 在不使用 100vh 的情况下强制 div 为整页高度
- gremlin - 顶点属性从 Gremlin 控制台更改,但不是从 Python 脚本更改
- raku - Perl6 cmp 两个字符串可以不区分大小写吗?
- c# - 单击第一个数据网格行不触发 selectedIndex 更改
- node.js - webpack-dev-server 不会在启动时创建初始包