提问者:小点点

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


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

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

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

我尝试了以下方法,但没有任何结果(或者执行在一个小时内没有停止)。我打算做的是将data拆分成更小的数据帧,并将其附加到列表(datist)中:

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

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

有没有聪明的方法?


共3个答案

匿名用户

我可以问一下,为什么不直接对数据帧进行切片呢。差不多

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

希望有帮助

匿名用户

首先,您的方法是低效的,因为逐行添加到列表会很慢,因为当没有足够的空间容纳新条目时,它必须周期性地增加列表。在这方面,列表理解更好,因为大小是预先确定并分配一次的。

然而,我认为基本上你的方法有点浪费,因为你已经有了一个数据帧,那么为什么要为每个用户创建一个新的数据帧呢?

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

然后生成所有唯一项的列表,然后可以使用这些项执行查找,最重要的是,如果只查询数据,则使用选择条件在数据帧上返回视图,而不会产生昂贵的数据拷贝。

使用熊猫。DataFrame.sort_values和熊猫。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'

匿名用户

您可以将Groupby对象转换为元组,然后转换为代码:

df = pd.DataFrame({'Name':list('aabbef'),
                   'A':[4,5,4,5,5,4],
                   'B':[7,8,9,4,2,3],
                   'C':[1,3,5,7,1,0]}, columns = ['Name','A','B','C'])

print (df)
  Name  A  B  C
0    a  4  7  1
1    a  5  8  3
2    b  4  9  5
3    b  5  4  7
4    e  5  2  1
5    f  4  3  0

d = dict(tuple(df.groupby('Name')))
print (d)
{'b':   Name  A  B  C
2    b  4  9  5
3    b  5  4  7, 'e':   Name  A  B  C
4    e  5  2  1, 'a':   Name  A  B  C
0    a  4  7  1
1    a  5  8  3, 'f':   Name  A  B  C
5    f  4  3  0}

print (d['a'])
  Name  A  B  C
0    a  4  7  1
1    a  5  8  3

不建议这样做,但可以按组创建数据帧:

for i, g in df.groupby('Name'):
    globals()['df_' + str(i)] =  g

print (df_a)
  Name  A  B  C
0    a  4  7  1
1    a  5  8  3