考虑以下示例
data1 = [{'type': 'one', 'delta': '1', 'time': '2019'}, {'type': 'two', 'delta': '1', 'time': '2018'}]
data2 = [{'type': 'one', 'delta': '1', 'time': '2013'}, {'type': 'two', 'delta': '1', 'time': '2012'}]
dftest = pd.DataFrame({'weirdjson' : [data1, data2]})
dftest['normalcol'] = 1
dftest
Out[79]:
weirdjson normalcol time_type_one time_type_two
0 [{'type': 'one', 'delta': '1', 'time': '2019'}, {'type': 'two', 'delta': '1', 'time': '2018'}] 1 2019 2018
1 [{'type': 'one', 'delta': '1', 'time': '2013'}, {'type': 'two', 'delta': '1', 'time': '2012'}] 1 2013 2012
基本上,我想创建两列time_type_one
和time_type_two
,每列包含其对应的time
值(对于第一行:2019
代表{{1} }和type one
代表2018
)。
如何在熊猫中做到这一点?我有很多行,所以我正在寻找效率很高的东西。 谢谢!
答案 0 :(得分:1)
尝试一下:
import json
import pandas as pd
data = [{'normalcol':1, 'weirdjsoncol':'[{"type": "one", "delta": "1", "time": "2019"}, {"type": "two", "delta": "1", "time": "2018"}]'}, {'normalcol':2, 'weirdjsoncol':'[{"type": "two", "delta": "1", "time": "2017"}, {"type": "one", "delta": "1", "time": "2013"}]'}]
df = pd.DataFrame(data)
df['time_type_one'] = df['weirdjsoncol'].apply(lambda x: next((i for i in json.loads(x) if i["type"] == "one"), None)["time"])
df['time_type_two'] = df['weirdjsoncol'].apply(lambda x: next((i for i in json.loads(x) if i["type"] == "two"), None)["time"])
答案 1 :(得分:1)
您可以尝试以下方法:
df_new = pd.DataFrame().append([x[y] for x in dftest.weirdjson for y in range(len(dftest.weirdjson))])
df_new = df_new.pivot(columns='type', values=['delta', 'time']).apply(lambda x: pd.Series(x.dropna().values))
df_new.columns = ['_'.join(col) for col in df_new.columns.values]
delta_one delta_two time_one time_two
0 1 1 2019 2018
1 1 1 2013 2017
答案 2 :(得分:1)
您可以使用explode,并构造一个新的数据框和push
类型的列,如下所示:
const arrays = this.array.push(String(this.userInput))