嘿,我有人通过Excel VBA来Python,作为处理我正在使用的大型数据集的一种方式。
我有几个基于深度的数据集,我需要“填充”一些数据集以匹配实际的最佳数据分辨率(当我进入图像聚类时)。这些图像让我获得0.01毫米的数据,而我的一些测量数据集是在大约40毫米的样本上。使用下面的代码从点im缩放测量数据。
我觉得我错过了Dataframes的观点并且回到了我的VBA(糟糕的??)习惯
我正在测试的数据集大约有50,000行,size
变量设置为200(即每行200 x .1mm,总共40 mm)。
在未来的某个阶段,对于以下每个a
b
c
集合的红外图像数组样式数据,我们会这样做。
我可以看到,由于迭代,这目前需要花费很多时间。希望有一个大脑可以看到我的笨手笨脚的代码
def new_depth(df, size):
x=0
for i in df['Depth']:
x=+1
measured_data = df.iloc[x, :]
for y in range(size):
if y!=0:
added_p = i+y
added_n = i-y
measured_data["Depth"] = added_p
df.loc[len(df)] = measured_data
measured_data["Depth"] = added_n
df.loc[len(df)]=measured_data
忽略一般概念的尺度:
初始df
Depth | Item1 | Item 2 | Item3
----- |-------|--------|------
10.01 | a | b | c
10.02 | d | e | f
10.03 | h | i | j
新df
Depth | Item1 | Item 2 | Item3
----- |-------|--------|------
etc
10.008 | a | b | c
10.009 | a | b | c
**10.010 | a | b | c**
10.011 | a | b | c
10.012 | a | b | c
etc
---------------------------------
etc
10.018 | d | e | f
10.019 | d | e | f
**10.020 | d | e | f**
10.021 | d | e | f
10.022 | d | e | f
etc
答案 0 :(得分:1)
step=0.001
df2 = df.reindex(pd.Float64Index(np.arange(df.index[0], df.index[-1]+step, step=step).round(3))).ffill()
这使用'深度'作为索引
np.arange(df.index[0], df.index[-1]+step, step=step).round(3)
生成range
array([ 10.01 , 10.011, 10.012, 10.013, 10.014, 10.015, 10.016,
10.017, 10.018, 10.019, 10.02 , 10.021, 10.022, 10.023,
10.024, 10.025, 10.026, 10.027, 10.028, 10.029, 10.03 ])
df.index[-1]+step
是为了确保包含最后一个索引。 .round(3)
是为了防止舍入错误。浮点比较是一件棘手的事情。
pd.Float64Index(<range>)
生成索引。它也可以在没有这一步的情况下工作,但会更明确。
df.reindex(<index>)
将此创建的索引设置为DataFrame
的新索引,并尝试在df
中查找与此索引匹配的旧条目。它用NaN
Item1 Item 2 Item3
Depth
10.010 a b c
10.011 NaN NaN NaN
10.012 NaN NaN NaN
10.013 NaN NaN NaN
10.014 NaN NaN NaN
10.015 NaN NaN NaN
10.016 NaN NaN NaN
10.017 NaN NaN NaN
10.018 NaN NaN NaN
10.019 NaN NaN NaN
10.020 d e f
10.021 NaN NaN NaN
10.022 NaN NaN NaN
10.023 NaN NaN NaN
10.024 NaN NaN NaN
10.025 NaN NaN NaN
10.026 NaN NaN NaN
10.027 NaN NaN NaN
10.028 NaN NaN NaN
10.029 NaN NaN NaN
10.030 h i j
.ffil()
使用前一行中的项目填充空项目。如果您只需要填写最多5个项目,则可以使用.ffil(limit=5)
。 ffill
是.fillna(method='ffill)