如何将 Pandas 数据框线性下采样到另一个列集?

问题描述

如何对一个数据帧进行下采样(线性)(在某些直径分布处计数,记录在下限处,因此第一个条目是 296.54 和 303.14 nm 之间的 0 个计数,第二个条目是 303.14 和 303.14 nm 之间的 1 个计数311.88 nm 等).

   296.54  303.14  311.88  320.87  ...  359.49  369.86  380.52  391.49
a       0       1       2       3  ...       7       8       9      10
b      11      12      13      14  ...      18      19      20      21
c      22      23      24      25  ...      29      30      31      32
d      33      34      35      36  ...      40      41      42      43
e      44      45      46      47  ...      51      52      53      54
f      55      56      57      58  ...      62      63      64      65
g      66      67      68      69  ...      73      74      75      76
h      77      78      79      80  ...      84      85      86      87
i      88      89      90      91  ...      95      96      97      98
j      99     100     101     102  ...     106     107     108     109

通过将计数重新采样为一组更粗略的直径来创建新的数据帧。像这样(第一个条目是 300 到 325 nm 之间的计数,等等):

         300                          325               350               375
a       4.34  interp sum btwn 325 and 350  btwn 350 and 375  btwn 375 and 400
b  and so on                                                                 
c                                                                            
d                                                                            
e                                                                            
f                                                                            
g                                                                            
h                                                                            
i                                                                            
j                                                                            

是否有 Pandas 插值函数,但通过线性和进行下采样,而不是上采样?

我尝试过这样的事情:

    test_array=(np.arange(110)).reshape(10,11)
    index_list=list(string.ascii_lowercase)[:10]
    df=pd.DataFrame(test_array,index=index_list)
    df.columns=  [296.54,303.14,311.88,320.87,330.12,339.63,349.42,359.49,369.86,380.52,391.49]
    new_columns=[300,325,350,375]

    new_df=test_df.groupby(new_columns,axis=1).sum()

但这行不通。给出明显的关键错误。一种提议的解决方案是使用索引位置,但这并没有跨部分值进行插值。

非常感谢

解决方法

groupby 是要走的路:

df.groupby(np.arange(df.shape[1])//3,axis=1).sum()

输出:

     0    1    2    3
a    3   12   21   30
b   39   48   57   66
c   75   84   93  102
d  111  120  129  138
e  147  156  165  174
f  183  192  201  210
g  219  228  237  246
h  255  264  273  282
i  291  300  309  318
j  327  336  345  354

更新:每条评论:

new_columns=np.array([0,2,7,10]) 
new_col_idx = np.searchsorted(new_columns,df.columns)

df.groupby(new_col_idx,axis=1).sum()

输出:

     0    1    2    3    4
a    0    3   25   27   11
b   12   27   85   63   23
c   24   51  145   99   35
d   36   75  205  135   47
e   48   99  265  171   59
f   60  123  325  207   71
g   72  147  385  243   83
h   84  171  445  279   95
i   96  195  505  315  107
j  108  219  565  351  119