将数据帧拆分为多个数据帧

新手上路,请多包涵

我有一个非常大的数据框(大约 100 万行),其中包含来自实验的数据(60 名受访者)。

我想将数据框分成 60 个数据框(每个参与者一个数据框)。

在数据 data 中,有一个名为 'name' 的变量,它是每个参与者的唯一代码。

我尝试了以下操作,但没有任何反应(或者执行不会在一个小时内停止)。我打算做的是将 data 拆分成更小的数据帧,并将它们附加到列表中( datalist ):

 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

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

有聪明的方法吗?

原文由 Martin Petri Bagger 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 565
2 个回答

首先,您的方法效率低下,因为逐行附加到列表会很慢,因为当新条目的空间不足时,它必须定期增加列表,列表理解在这方面更好,因为大小已确定前面分配一次。

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

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

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

使用 pandas.DataFrame.sort_valuespandas.DataFrame.set_index

 # 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'

原文由 EdChum 发布,翻译遵循 CC BY-SA 4.0 许可协议

我能问一下为什么不直接通过切片数据框来做到这一点吗?就像是

#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']

原文由 Woody Pride 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题