在pandas / python中创建多个子数据帧

时间:2017-08-24 11:06:02

标签: python list pandas dataframe

我有一个类似于此的数据框(大约有300k行):

df = DataFrame(dict(name = ['jon', 'jon', 'dany', 'dany', 'mindy', 'mindy', 'mindy'], 
          power = [1, 2, 2 ,4 ,5 ,5, 7], 
          rank =  ['a', 'b', 'c', 'd', 'r', 'a', 'g']))

给出了这个:

enter image description here

我想要的是这样的数据帧(子集)列表:

df_list = [df_1, df_2, df_3]

其中df_1,df_2,df_3基本上就是这些:

df_1 = df.query("name == 'jon'")
df_2 = df.query("name == 'dany'")
df_3 = df.query("name == 'mindy'")

在我正在使用的数据集中,大约有500多个names。那么我该如何有效地做到这一点呢?

2 个答案:

答案 0 :(得分:3)

这是单向的。

In [1497]: df_list = [x[1] for x in df.groupby('name', sort=False)]

In [1498]: df_list[0]
Out[1498]:
  name  power rank
0  jon      1    a
1  jon      2    b

In [1499]: df_list[1]
Out[1499]:
   name  power rank
2  dany      2    c
3  dany      4    d

In [1500]: df_list[2]
Out[1500]:
    name  power rank
4  mindy      5    r
5  mindy      5    a
6  mindy      7    g

,最好将它们存储为dict

In [1501]: {g: v for g, v in df.groupby('name', sort=False)}
Out[1501]:
{'dany':    name  power rank
 2  dany      2    c
 3  dany      4    d, 'jon':   name  power rank
 0  jon      1    a
 1  jon      2    b, 'mindy':     name  power rank
 4  mindy      5    r
 5  mindy      5    a
 6  mindy      7    g}

In [1502]: df_dict = {g: v for g, v in df.groupby('name', sort=False)}

In [1503]: df_dict['jon']
Out[1503]:
  name  power rank
0  jon      1    a
1  jon      2    b

答案 1 :(得分:1)

您可以尝试这样做

import pandas as pd
df = pd.DataFrame(dict(name = ['jon', 'jon', 'dany', 'dany', 'mindy', 'mindy', 'mindy'], 
          power = [1, 2, 2 ,4 ,5 ,5, 7], 
          rank =  ['a', 'b', 'c', 'd', 'r', 'a', 'g']))

dfs = []
for each in df.name.unique():
    dfs.append(df.loc[df.name == each,:])

或者,您可以使用numpy执行此操作 -

import numpy as np
dfs2 = []
array = df.values
for each in np.unique(array[:,0]):
    dfs2.append(pd.DataFrame(array[array[:,0] == each,:]))

上述两种方法之间的速度比较 -

import pandas as pd
import numpy as np
from time import time

df = pd.DataFrame(dict(name = ['jon', 'jon', 'dany', 'dany', 'mindy', 'mindy', 'mindy'], 
          power = [1, 2, 2 ,4 ,5 ,5, 7], 
          rank =  ['a', 'b', 'c', 'd', 'r', 'a', 'g']))

t0 = time()
dfs = []
for each in df.name.unique():
    dfs.append(df.loc[df.name == each,:])

t1 = time()
dfs2 = []
array = df.values
for each in np.unique(array[:,0]):
    dfs2.append(pd.DataFrame(array[array[:,0] == each,:]))

t2 = time()

t1 - t0 #0.003524303436279297
t2 - t1 #0.0016787052154541016

Numpy速度更快,因为您拥有大型数据集

,因此可以提供帮助