循环虽然Dataframes感觉不对

时间:2017-05-22 14:21:01

标签: python pandas dataframe

嘿,我有人通过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

1 个答案:

答案 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

.ffil()使用前一行中的项目填充空项目。如果您只需要填写最多5个项目,则可以使用.ffil(limit=5)ffill.fillna(method='ffill)

的同义词