【问题标题】:Split DataFrame and apply code to all DataFrames at once?拆分 DataFrame 并将代码一次应用于所有 DataFrame?
【发布时间】:2017-06-08 13:33:04
【问题描述】:

我想按列值将我的 DataFrame 从十二行分成三个 DataFrame,然后将一组代码同时应用于所有 DataFrame。

    A     B      C      
 1  A   0.25     0      
 2  A   0.50     0      
 3  A   0.75     0     
 4  B   1.00     1      
 5  B   1.25     1      
 6  B   1.75     1      
 7  C   0.50     1     
 8  C  -0.25     0      
 9  C   1.25     1      
10  D   0.75     1      
11  D  -0.75     0      
12  D  -1.00    -1 

生成的 DataFrames 应该是:

    A     B      C      
 1  A   0.25     0      
 2  A   0.50     0      
 3  A   0.75     0

 4  B   1.00     1      
 5  B   1.25     1      
 6  B   1.75     1

 7  C   0.50     1     
 8  C  -0.25     0      
 9  C   1.25     1

10  D   0.75     1      
11  D  -0.75     0      
12  D  -1.00    -1 

到目前为止,我已经尝试过df.groupby(['A'])df.set_index(['A']),但这些函数似乎不允许我应用一组代码而不会出错。

【问题讨论】:

    标签: python pandas dataframe split group-by


    【解决方案1】:

    通过转换为tuple,然后转换为dictgroupby 对象,在所有DataFrames 中创建dict 最简单:

    d = dict(tuple(df.groupby('A')))
    print (d)
    {'B':    A     B  C
    4  B  1.00  1
    5  B  1.25  1
    6  B  1.75  1, 'A':    A     B  C
    1  A  0.25  0
    2  A  0.50  0
    3  A  0.75  0, 'D':     A     B  C
    10  D  0.75  1
    11  D -0.75  0
    12  D -1.00 -1, 'C':    A     B  C
    7  C  0.50  1
    8  C -0.25  0
    9  C  1.25  1}
    
    print (d['A'])
       A     B  C
    1  A  0.25  0
    2  A  0.50  0
    3  A  0.75  0
    

    对于应用功能可以使用:

    for i, x in d.items():
        d[i] = x.mean(axis=1)
    
    print (d['A'])
    1    0.125
    2    0.250
    3    0.375
    dtype: float64
    

    但更好的是使用带有自定义功能的groupby - 请参阅docs

    def f(x):
        print (x)
        return x.mean(axis=1)
    
    df1 = df.groupby('A').apply(f)
    print (df1)
    A  1     0.125
       2     0.250
       3     0.375
    B  4     1.000
       5     1.125
       6     1.375
    C  7     0.750
       8    -0.125
       9     1.125
    D  10    0.875
       11   -0.375
       12   -1.000
    dtype: float64
    

    【讨论】:

    • 此解决方案按实施工作。如何在字典元组中执行函数?在此示例中,分配 sum_d = d['A']['C'].sum() 将采用列 C 的总和,但不会采用所有字典键 (A,B,C,D) 的总和在 d['A'] 中。是否可以一次执行遍历所有字典键的函数?
    • 不,很遗憾没有。您必须迭代和应用函数。 :(
    • 有没有办法遍历这个元组字典?理想情况下,我可以遍历这个元组字典,就好像 DataFrame 曾经是 DataFrame 一样(以免对键 A、B、C、D 重复)。
    • 嗯,在dict中迭代不是更容易吗? for i, x in d.items(): print (x) ?
    • 并不是说在 dict 中迭代并不一定更容易,但我有 20-50 个函数必须按原样应用于 DataFrame。遍历字典有效地摆脱了 DataFrame。
    猜你喜欢
    • 2020-01-15
    • 2012-09-26
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多