【问题标题】:Split very large Pandas dataframe, alternative to Numpy array_split拆分非常大的 Pandas 数据帧,替代 Numpy array_split
【发布时间】:2019-01-29 11:41:05
【问题描述】:

关于使用 Numpy array_split 方法的行数限制有什么想法吗?

我有一个 dataframe 有 +6m 行,想把它分成 20 个左右的块。

我的尝试遵循如下所述: Split a large pandas dataframe

使用 Numpy 和 array_split 函数,但是作为一个非常大的 dataframe 它只会永远持续下去。

我的dataframe 是 df,包括 8 列和 660 万行。

df_split = np.array_split(df,20)

关于拆分此的替代方法的任何想法?或者,也欢迎提高数据帧性能的提示。

【问题讨论】:

  • 数组应该如何?每个数组有多少行?也许你可以在循环或列表理解中做到这一点。也换成(df.values,20)看看是不是更快
  • 你也试过this吗?
  • 鉴于有 660 万行,n = 20 拆分意味着每个数组大约有 330k 行。但是这个分割有点随意,可以是 10、20 或 100,我的重点是性能。
  • 谢谢@markuscosinus。是的,做到了,但似乎也不起作用,所以恢复到原来的方法。
  • 您是否尝试过只使用普通的旧.iloc,然后将每个视图保存到一个文件并单独处理每个文件?

标签: python pandas numpy dataframe split


【解决方案1】:

也许这可以通过将数据框分成块来解决您的问题,如下例所示:

import numpy as np
import pandas as pds

df = pds.DataFrame(np.random.rand(14,4), columns=['a', 'b', 'c', 'd'])

def chunker(seq, size):
    return (seq[pos:pos + size] for pos in range(0, len(seq), size))

for i in chunker(df,5):
    df_split = np.array_split(i, 20)
    print(df_split)

【讨论】:

  • 谢谢,目前看来这个解决方案会有所帮助。我的部分问题是生成这些以便将它们导入到 bigquery 中。看起来这个解决方案将允许正确地破坏数据并插入它。
  • 如果你的意思是向表中插入数据,你也可以使用 sqlalchemy 连接同一查询 sql 中的所有块值并循环到每个块,这是提高性能示例的最佳解决方案:sqlinsert = "INSERT INTO table ( col_1, col_2, col_3) VALUES ("+your_bid_data_implode+")"
【解决方案2】:

我没有通用的解决方案,但是您可以考虑两件事:

  1. 您可以尝试分块加载数据,而不是先加载然后拆分。如果您使用pandas.read_csv skiprows 参数将是要走的路。
  2. 您可以使用df.values.reshape((20,-1,8)) 重塑您的数据。但是,这需要行数可以被 20 整除。您可以考虑不使用最后一个(最多 19 个)样本来使其适合。这当然是最快的解决方案。

【讨论】:

    【解决方案3】:

    对 Houssem Maamria 的代码稍作修改,此文件可以帮助尝试将每个块导出到 excel 文件的人。

    
    import pandas as pd
    import numpy as np
    
    dfLista_90 = pd.read_excel('my_excel.xlsx', index_col = 0) # to include the headers
    
    count = 0
    limit = 200
    rows = len(dfLista_90)
    partition = (rows // limit) + 1
    
    def chunker(df, size):
        return (df[pos:pos + size] for pos in range(0, len(df), size))
    
    for a in chunker(dfLista_90, limit):
        to_excel = np.array_split(a, partition)
        count += 1
        a.to_excel('file_{:02d}.xlsx'.format(count), index=True)
    

    【讨论】:

    • 以下是How do I write a good answer? 的一些指南。提供的这个答案可能是正确的,但它可以从解释中受益。仅代码答案不被视为“好”答案。来自review
    猜你喜欢
    • 2019-11-25
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    相关资源
    最近更新 更多