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

问题描述 投票:1回答:2

以下代码有效,但我有兴趣了解是否有更有效的方式写入数据帧,而不是一次只有1行。

我有一个json响应workoutSamples,它在“data”节点包含一些嵌套的json,我将其添加到数据帧中。因此,例如,是否有更简单的方法将下面的所有d['cadence']拉入列'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"]]
python pandas dataframe
2个回答
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
投票

对于大量列,下面的代码将更快 -

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)
© www.soinside.com 2019 - 2024. All rights reserved.