Python-将数据框拆分为多个数据框

发布于 2021-02-02 23:20:05

我有一个非常大的数据框(大约一百万行),其中包含来自实验的数据(60位受访者)。我想将数据框分成60个数据框(每个参与者一个数据框)。

在数据帧(称为=数据)中,有一个名为“名称”的变量,它是每个参与者的唯一代码。

我已经尝试了以下方法,但是没有任何反应(或者一小时内没有停止)。我打算做的是将数据帧(数据)拆分为较小的数据帧,并将其附加到列表(数据列表)中:

import pandas as pd

def splitframe(data, name='name'):

    n = data[name][0]

    df = pd.DataFrame(columns=data.columns)

    datalist = []

    for i in range(len(data)):
        if data[name][i] == n:
            df = df.append(data.iloc[i])
        else:
            datalist.append(df)
            df = pd.DataFrame(columns=data.columns)
            n = data[name][i]
            df = df.append(data.iloc[i])

    return datalist

我没有收到错误消息,脚本似乎可以永远运行!

有什么聪明的方法吗?

关注者
0
被浏览
167
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    首先,你的方法效率低下,因为在没有足够的空间容纳新条目的情况下,由于必须定期增长列表,因此逐行追加到列表的速度很慢,因此列表大小在此方面会更好,因为前面并分配一次。

    但是,我认为从根本上讲,你的方法有点浪费,因为你已经有了一个数据框,为什么要为这些用户中的每一个创建一个新的?

    我将按列对数据帧进行排序'name',将索引设置为此,如果需要,则不要删除该列。

    然后生成所有唯一条目的列表,然后你可以使用这些条目执行查找,并且至关重要的是,如果仅查询数据,请使用选择条件返回数据框上的视图,而不会产生昂贵的数据副本。

    所以:

    # sort the dataframe
    df.sort(columns=['name'], inplace=True)
    # set the index to be this and don't drop
    df.set_index(keys=['name'], drop=False,inplace=True)
    # get a list of names
    names=df['name'].unique().tolist()
    # now we can perform a lookup on a 'view' of the dataframe
    joe = df.loc[df.name=='joe']
    # now you can query all 'joes'
    

    编辑
    sort现在已弃用,你需要立即使用sort_values

    # sort the dataframe
    df.sort_values(by='name', axis=1, inplace=True)
    # set the index to be this and don't drop
    df.set_index(keys=['name'], drop=False,inplace=True)
    # get a list of names
    names=df['name'].unique().tolist()
    # now we can perform a lookup on a 'view' of the dataframe
    joe = df.loc[df.name=='joe']
    # now you can query all 'joes'
    


  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    为什么不只通过切片数据帧来做到这一点。就像是

    #create some data with Names column
    data = pd.DataFrame({'Names': ['Joe', 'John', 'Jasper', 'Jez'] *4, 'Ob1' : np.random.rand(16), 'Ob2' : np.random.rand(16)})
    
    #create unique list of names
    UniqueNames = data.Names.unique()
    
    #create a data frame dictionary to store your data frames
    DataFrameDict = {elem : pd.DataFrame for elem in UniqueNames}
    
    for key in DataFrameDict.keys():
        DataFrameDict[key] = data[:][data.Names == key]
    

    嘿,请记住,你有一个数据帧字典,就像(我想)你想要它们一样。需要访问一个吗?只需输入

    DataFrameDict['Joe']
    

    希望能有所帮助



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看