遍历数据帧的所有行

时间:2020-08-31 12:35:48

标签: python pandas dataframe loops

因此我的数据框由50万行/ 3列组成,并基于此我想创建一个json文件

jsonFile = {
    "attribute1": [
        {
          "key1": "a",
          "key2": "b",
          "key3": c
        },
        {
          "key1": "d",
          "key2": "e",
          "key3": f
        },
        (...)
    ]
}

这样做

jsonFile['attribute1'] = []

for i in range(0,len(df)):
    jsonFile['attribute1'].append({
            "key1": df["col1"][i],
            "key2": df["col2"][i],
            "key3": df["col3"][i]
        })

花费的时间太长。我读了一些有关Numpy Vectorization的内容,但不知道这是否适用于我的情况,因为在我看到的所有示例中,都使用该方法添加了新列。

1 个答案:

答案 0 :(得分:4)

您应该避免对数据帧使用Python for循环。

在这种情况下,您可以使用.rename重命名列,然后将.to_dictorient='records'一起使用:

df = pd.DataFrame({'col1': [1, 2, 3], 'col2': [4, 5, 6]})
output = {'attribute1': df.rename(columns={'col1': 'key1', 'col2': 'key2'}).to_dict(orient='records')}
print(output)

将输出

{'attribute1': [{'col1': 1, 'col2': 4}, {'col1': 2, 'col2': 5}, {'col1': 3, 'col2': 6}]}

使用上述方法检查50万行的计时快约12倍:

from timeit import Timer

df = pd.DataFrame({'col1': list(range(500000)), 'col2': list(range(500000))})

def rename_and_to_dict():
    {'attribute1': df.rename(columns={'col1': 'key1', 'col2': 'key2'}).to_dict(orient='records')}

def for_loop():
    output = {'attribute1': []}
    for i in range(0, len(df)):
        output['attribute1'].append({
            "key1": df["col1"][i],
            "key2": df["col2"][i]
        })


print('rename_and_to_dict', min(Timer(rename_and_to_dict).repeat(1, 1)))
print('for_loop', min(Timer(for_loop).repeat(1, 1)))

输出

rename_and_to_dict 0.3934917000000001
for_loop 4.469996500000001