簡體   English   中英

從帶有描述的 Numpy nd 數組創建 Pandas DataFrame 的更快方法?

[英]Faster way to create Pandas DataFrame from a Numpy nd array with descriptions?

我想將帶有維度描述的 numpy nd 數組轉換為 pandas dataframe。 以下解決方案有效,但對於 360000 行似乎有點慢(在我的機器上為 1.5 秒,您的結果可能會有所不同)。

import pandas as pd
import numpy as np
from itertools import product
import time

# preparation of data
nd_data = np.random.random((5, 3, 100, 10, 4, 6))
dimension_descriptions = {
    'floaty': [0.1,0.2,0.3,0.4,0.5],
    'animal': ['ducks', 'horses', 'elephants'],
    'ramp': range(100),
    'another_ramp': range(10),
    'interesting number': [12, 15, 29, 42],
    'because': ['why', 'is', 'six', 'afraid', 'of', 'seven']
}

t_start = time.time()
# create dataframe from list of dictionairies containing data and permuted descriptions
df = pd.DataFrame([{**{'data': data}, **dict(zip(dimension_descriptions.keys(), permuted_description))}
                   for data, permuted_description in zip(nd_data.flatten(), product(*dimension_descriptions.values()))])
print(f'elapsed time: {time.time()- t_start:.1f}s')

有沒有更快的方法來達到相同的結果?

在我的機器上,我將創建 df 的原始方法放在 function 中並對其進行計時。

def create_df1(nd_data, dimension_descriptions):
    return pd.DataFrame([{**{'data': data}, **dict(zip(dimension_descriptions.keys(), permuted_description))}
                   for data, permuted_description in zip(nd_data.flatten(), product(*dimension_descriptions.values()))])

%timeit create_df1(nd_data, dimension_descriptions)
991 ms ± 37.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

您可以避免創建臨時字典並將其添加到新字典,只需在首次創建原始置換數據后將 nd_data 分配給nd_data 這會稍微提高速度。

def create_df2(nd_data, dimension_descriptions):
    df = pd.DataFrame([dict(zip(dimension_descriptions.keys(), permuted_description))
                       for permuted_description in product(*dimension_descriptions.values())])
    df["data"] = nd_data.flatten()
    return df

%timeit create_df2(nd_data, dimension_descriptions)
822 ms ± 42.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

如果您需要將data列作為 dataframe 中的第一列,則可以使用df.insert(0, "data", nd_data.flatten())代替,它在我的機器上獲得類似的速度結果。

每次創建具有相同列名的字典似乎也很浪費。 Pandas 提供了一種避免這種情況的方法,它允許您將列列表作為單獨的參數傳遞,並且您可以將數據作為列表列表傳遞。 這可以節省很多時間。

def create_df3(nd_data, dimension_descriptions):
    df = pd.DataFrame(list(product(*dimension_descriptions.values())), columns=dimension_descriptions.keys())
    df["data"] = nd_data.flatten()
    return df

%timeit create_df3(nd_data, dimension_descriptions)
281 ms ± 9.88 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM