问题描述
如何对一个数据帧进行下采样(线性)(在某些直径分布处计数,记录在下限处,因此第一个条目是 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