我有一个非常大的数据框(大约 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 许可协议
首先,您的方法效率低下,因为逐行附加到列表会很慢,因为当新条目的空间不足时,它必须定期增加列表,列表理解在这方面更好,因为大小已确定前面分配一次。
但是,我认为从根本上说,您的方法有点浪费,因为您已经有了一个数据框,那么为什么要为每个用户创建一个新的数据框呢?
我会按列
'name'
对数据框进行排序,将索引设置为此,如果需要则不要删除该列。然后生成所有唯一条目的列表,然后您可以使用这些条目执行查找,并且至关重要的是,如果您只查询数据,请使用选择标准返回数据框上的视图,而不会产生昂贵的数据副本。
使用
pandas.DataFrame.sort_values
和pandas.DataFrame.set_index
: