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

Mar*_*ger 72 python split dataframe pandas

我有一个非常大的数据帧(大约100万行)和实验数据(60个受访者).我想将数据帧拆分为60个数据帧(每个参与者的数据帧).

在数据框(称为= data)中,有一个名为"name"的变量,它是每个参与者的唯一代码.

我尝试了以下,但没有任何反应(或者不会在一小时内停止).我打算做的是将数据帧(数据)拆分成更小的数据帧并将它们附加到列表(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
Run Code Online (Sandbox Code Playgroud)

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

有一种聪明的方法吗?

Woo*_*ide 59

我可以问为什么不通过切片数据框来做到这一点.就像是

#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]
Run Code Online (Sandbox Code Playgroud)

嘿presto你有一个数据框架的字典就像(我认为)你想要它们.需要访问一个?输入

DataFrameDict['Joe']
Run Code Online (Sandbox Code Playgroud)

希望有所帮助


EdC*_*ica 45

首先,你的方法是低效的,因为逐行附加到列表将是缓慢的,因为当新条目的空间不足时必须定期增加列表,在这方面列表推导更好,因为确定了大小前面并分配一次.

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

我会按列对数据帧进行排序'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'
Run Code Online (Sandbox Code Playgroud)

编辑

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'
Run Code Online (Sandbox Code Playgroud)

  • @ShivamAgrawal我认为这是最近的事情,过去`to_list`会对'Pandas`对象起作用,而'tolist`是np数组上的一个方法,看起来他们现在语法上的api一样,更新了我的答案反映这一点 (3认同)
  • 据我了解 - 排序时轴应该为零 (3认同)
  • @GeorgesHb不同的规则是有点模糊当你使用`loc`进行初始视图然后你进一步过滤它或使用`set_value`来更新那个视图时,如果你这样做它会引发警告,最好是使用`loc`和你的完整过滤器并同时设置列以避免这种情况,例如在你的情况下`view = df.loc [(df.name == j)&df ['col'] .isin(values) ,'col'] = -1`或类似 (2认同)

jez*_*ael 35

您可以将groupby对象转换为tuples然后转换为dict:

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
Run Code Online (Sandbox Code Playgroud)


Gus*_*ava 14

Groupby可以帮助您:

grouped

然后,您可以使用每个参与者的数据框来处理每个组.而DataFrameGroupBy对象方法(如apply,transform,aggregate,head,first,last)返回一个DataFrame对象.

或者您可以l_grouped[0][1]通过索引制作列表并获取所有DataFrame:

grouped - 具有名字的第一组的DataFrame.


Qui*_*2k1 9

除了 Gusev Slava 的回答之外,您可能还想使用 groupby 的组:

{key: df.loc[value] for key, value in df.groupby("name").groups.items()}
Run Code Online (Sandbox Code Playgroud)

这将生成一个字典,其中包含您分组的键,指向相应的分区。优点是键被维护并且不会在列表索引中消失。


Dan*_*aun 8

简单:

[v for k, v in df.groupby('name')]
Run Code Online (Sandbox Code Playgroud)

  • `{k: v for k, v in df.groupby("name")}` 如果你想使用 dict。 (6认同)