将数据写入pandas数据帧的最佳方式

时间:2018-03-30 05:56:40

标签: python pandas dataframe

以下代码有效,但我有兴趣了解是否有更有效的方式写入数据帧,而不是一次只有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"]]

2 个答案:

答案 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)