我有一个类似于此的数据框(大约有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']))
给出了这个:
我想要的是这样的数据帧(子集)列表:
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
。那么我该如何有效地做到这一点呢?
答案 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速度更快,因为您拥有大型数据集
,因此可以提供帮助