使用.apply()时添加行

时间:2018-03-22 22:01:40

标签: python pandas

我想申请"聚合"函数发送到一个DataFrame的groupby实例,结果不会减少最终的行数,而是增加它(不是#34;聚合")。例如,下面的调用应该导致cat = A,B行的重复,具体取决于函数返回的结果(colacolb列)。不幸的是,添加的索引列以某种方式在结果中添加为列。

>>> df = pd.DataFrame({
  'date': pd.date_range('1/1/2018', periods=10, freq='10D'),
  'val': range(10),
  'cat': ['A'] * 7 + ['B'] * 3
})

>>> def func(x):
        data = range(20)
        # 2 x 10 = 20 rows
        index = pd.MultiIndex.from_product([
          [3, 4], pd.date_range('1/1/2018', periods=10, freq='10D')
        ], names=['cola', 'colb'])
        return pd.Series(data, index=index)

>>> df.groupby('cat').apply(func)
cola          3                                                         \
colb 2018-01-01 2018-01-11 2018-01-21 2018-01-31 2018-02-10 2018-02-20   
cat                                                                      
A             0          1          2          3          4          5   
B             0          1          2          3          4          5   

cola                                                      4             \
colb 2018-03-02 2018-03-12 2018-03-22 2018-04-01 2018-01-01 2018-01-11   
cat                                                                      
A             6          7          8          9         10         11   
B             6          7          8          9         10         11   

cola                                                                    \
colb 2018-01-21 2018-01-31 2018-02-10 2018-02-20 2018-03-02 2018-03-12   
cat                                                                      
A            12         13         14         15         16         17   
B            12         13         14         15         16         17   

cola                        
colb 2018-03-22 2018-04-01  
cat                         
A            18         19  
B            18         19 

我可以做些什么来完成这项工作,或.apply()是否只是不想重复行?

1 个答案:

答案 0 :(得分:1)

IIUC:你不想归还一个系列赛。改为返回一个DataFrame。

def func(x):
    data = range(20)
    # 2 x 10 = 20 rows
    index = pd.MultiIndex.from_product([
      [3, 4], pd.date_range('1/1/2018', periods=10, freq='10D')
    ], names=['cola', 'colb'])
    return pd.DataFrame(dict(Stuff=data), index=index)

df.groupby('cat').apply(func)

                     Stuff
cat cola colb             
A   3    2018-01-01      0
         2018-01-11      1
         2018-01-21      2
         2018-01-31      3
         2018-02-10      4
         2018-02-20      5
         2018-03-02      6
         2018-03-12      7
         2018-03-22      8
         2018-04-01      9
    4    2018-01-01     10
         2018-01-11     11
         2018-01-21     12
         2018-01-31     13
         2018-02-10     14
         2018-02-20     15
         2018-03-02     16
         2018-03-12     17
         2018-03-22     18
         2018-04-01     19
B   3    2018-01-01      0
         2018-01-11      1
         2018-01-21      2
         2018-01-31      3
         2018-02-10      4
         2018-02-20      5
         2018-03-02      6
         2018-03-12      7
         2018-03-22      8
         2018-04-01      9
    4    2018-01-01     10
         2018-01-11     11
         2018-01-21     12
         2018-01-31     13
         2018-02-10     14
         2018-02-20     15
         2018-03-02     16
         2018-03-12     17
         2018-03-22     18
         2018-04-01     19

或者,您可以保留系列并使用pd.concat

def func(x):
    data = range(20)
    # 2 x 10 = 20 rows
    index = pd.MultiIndex.from_product([
      [3, 4], pd.date_range('1/1/2018', periods=10, freq='10D')
    ], names=['cola', 'colb'])
    return pd.Series(data, index=index)

pd.concat({key: func(value) for key, value in df.groupby('cat')})

   cola  colb      
A  3     2018-01-01     0
         2018-01-11     1
         2018-01-21     2
         2018-01-31     3
         2018-02-10     4
         2018-02-20     5
         2018-03-02     6
         2018-03-12     7
         2018-03-22     8
         2018-04-01     9
   4     2018-01-01    10
         2018-01-11    11
         2018-01-21    12
         2018-01-31    13
         2018-02-10    14
         2018-02-20    15
         2018-03-02    16
         2018-03-12    17
         2018-03-22    18
         2018-04-01    19
B  3     2018-01-01     0
         2018-01-11     1
         2018-01-21     2
         2018-01-31     3
         2018-02-10     4
         2018-02-20     5
         2018-03-02     6
         2018-03-12     7
         2018-03-22     8
         2018-04-01     9
   4     2018-01-01    10
         2018-01-11    11
         2018-01-21    12
         2018-01-31    13
         2018-02-10    14
         2018-02-20    15
         2018-03-02    16
         2018-03-12    17
         2018-03-22    18
         2018-04-01    19
dtype: int64