以下代码有效,但我有兴趣了解是否有更有效的方式写入数据帧,而不是一次只有1行。
我有一个json响应workoutSamples
,它在"数据"中包含一些嵌套的json。我要添加到数据帧的节点。例如,有一种更简单的方法就是将下面的所有d['cadence']
拉入列“节奏”中。在数据框中为整个列插入1个插入,而不是循环遍历每个节点并一次插入1行?
workouts_stats_intra = pd.DataFrame(
columns=['workoutId', 'seconds', 'cadence', 'distance', 'heart_rate', 'power', 'speed'])
for d in workoutSamples:
workoutId = d["workoutId"]
logger.info("Workout Details: " + str(workoutId))
for row in d["data"]:
workouts_stats_intra.loc[len(workouts_stats_intra)] = [workoutId, row["seconds_since_pedaling_start"],
row["cadence"], row["distance"], row["heart_rate"],
row["power"], row["speed"]]
答案 0 :(得分:0)
我认为更好的是通过追加元组创建列表然后传递给DataFrame
构造函数:
L = []
for d in workoutSamples:
workoutId = d["workoutId"]
logger.info("Workout Details: " + str(workoutId))
for row in d["data"]:
L.append((workoutId, row["seconds_since_pedaling_start"],
row["cadence"], row["distance"], row["heart_rate"],
row["power"], row["speed"]))
workouts_stats_intra = pd.DataFrame(L,
columns=['workoutId', 'seconds', 'cadence', 'distance', 'heart_rate', 'power', 'speed'])
另一种可能的解决方案是使用json_normalize
。
答案 1 :(得分:-1)
对于大量列,下面的代码可以更快地运行 -
test = [{'Id' :1, 'Data':[{'Col1': 1, 'Col2':1, 'Col3':1}, {'Col1': 1, 'Col2':1, 'Col3':1}]},
{'Id' :2, 'Data':[{'Col1': 2, 'Col2':2, 'Col3':2}]},
{'Id' :3, 'Data':[{'Col1': 3, 'Col2':3, 'Col3':3}]}]
pd.concat([pd.concat([pd.Series([test[t1]['Id']]*len(test[t1]['Data']), name='Id'), pd.DataFrame.from_dict(test[t1]['Data'])], axis=1) for t1 in range(len(test))], axis=0)