【问题标题】:create multiple sub-dataframes in pandas/python [duplicate]在 pandas/python 中创建多个子数据框 [重复]
【发布时间】:2018-02-02 05:46:43
【问题描述】:

我有一个与此类似的数据框(大约有 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。那么我如何有效地做到这一点呢?

【问题讨论】:

标签: python list pandas dataframe


【解决方案1】:

这是一种方法。

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

【讨论】:

    【解决方案2】:

    你可以试试这个

    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 速度更快,对您的情况很有帮助,因为您拥有大型数据集

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 2023-03-19
      • 2018-03-15
      • 1970-01-01
      • 2013-10-13
      • 2021-10-17
      • 1970-01-01
      相关资源
      最近更新 更多