繁体   English   中英

在 Python 中多次拆分 dataframe 的有效方法?

[英]Efficient method to split dataframe multiple times in Python?

我目前有一个pandas DataFrame df ,大小为 168078 行 × 43 列。 df的摘要如下所示:

              doi                           gender       order       year       ...       count
9384155       10.1103/PRL.102.039801        male         1           2009       ...       1
...
3679211       10.1103/PRD.69.024009         male         2           2004       ...       501

df当前按count排序,因此从 1 到 501 不等。

我想通过按计数将df拆分为 501 个较小的子数据。 换句话说,在过程结束时,我将有 501 个不同的 sub df和每个特征count数值。

由于生成的(所需)DataFrame 的数量非常多,而且它是定量数据,我想知道是否:

a)可以多次拆分DataFrame(如果是,那么如何),并且

b) 可以对每个 DataFrame 进行定量命名,而无需手动命名 501 次; 即,例如, count == 1df将是df.1而不必分配它。

您可以做的最佳实践是创建数据框字典。 下面我给大家举个例子:

df=pd.DataFrame({'A':[4,5,6,7,7,5,4,5,6,7],
                 'count':[1,2,3,4,5,6,7,8,9,10],
                 'C':['a','b','c','d','e','f','g','h','i','j']})
print(df)

   A  count  C
0  4      1  a
1  5      2  b
2  6      3  c
3  7      4  d
4  7      5  e
5  5      6  f
6  4      7  g
7  5      8  h
8  6      9  i
9  7     10  j

现在我们创建字典。 如您所见,关键是每行中的计数值。 请记住,这里Series.unique用于在有两行具有相同计数值的情况下,然后它们在同一个字典中创建。

dfs={key:df[df['count']==key] for key in df['count'].unique()}

下面我展示了创建的整个字典的内容以及如何访问它:

for key in dfs:
    print(f'dfs[{key}]')
    print(dfs[key])
    print('-'*50)


dfs[1]
   A  count  C
0  4      1  a
--------------------------------------------------
dfs[2]
   A  count  C
1  5      2  b
--------------------------------------------------
dfs[3]
   A  count  C
2  6      3  c
--------------------------------------------------
dfs[4]
   A  count  C
3  7      4  d
--------------------------------------------------
dfs[5]
   A  count  C
4  7      5  e
--------------------------------------------------
dfs[6]
   A  count  C
5  5      6  f
--------------------------------------------------
dfs[7]
   A  count  C
6  4      7  g
--------------------------------------------------
dfs[8]
   A  count  C
7  5      8  h
--------------------------------------------------
dfs[9]
   A  count  C
8  6      9  i
--------------------------------------------------
dfs[10]
   A  count  C
9  7     10  j
--------------------------------------------------

您可以使用 groupby 来获得如下结果g.groups :将为每个组提供组名(组 ID) g.get_group :将为您提供一个具有给定组名的组

import numpy as np
import pandas as pd

df=pd.DataFrame({'A':np.random.choice(["a","b","c", "d"], 10),
                 'count':np.random.choice(10,10)
                })

g = df.groupby("count")
for key in g.groups:
    print(g.get_group(key))
    print("\n---------------")

结果

   A  count
3  c      0

---------------
   A  count
9  a      2

---------------
   A  count
0  c      3
2  b      3

---------------
   A  count
1  b      4
5  d      4
6  a      4
7  b      4

---------------
   A  count
8  c      5

---------------
   A  count
4  d      8

---------------

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM