使用.apply创建pandas日期框架

时间:2018-01-20 20:44:42

标签: python pandas

我的研究主要围绕使用激光雷达点云数据。获取的数据是X,Y,Z,R,G,B值。据我所知,这些值在导出时是随机顺序。此外,行和列的大小不同。 "额外"将填充默认值(下面的代码中为零)。我决定使用Pandas,因为我可以将索引和列名称/值设置为Z和X坐标(numpy不可能)。这允许我通过使用.set_value方法分配值来避免循环(出于缩放的原因)(我知道这是折旧的,但它比.at快〜{3}}。.apply

我想以这种方式对数据进行排序的原因是我可以将数据可视化并将其更改为具有.imshow()或类似内容的图像。

我担心这是对.apply的不当使用,而我使用熊猫的原因以后不会解决,但对于我的生活,我无法想到除了更糟糕的循环之外,另一种方法可以做到这一点。

master_df的样本(由下面的@Alex提供):

          B         G         R    X    Y    Z
0  0.206623  0.385774  0.228514  0.0  2.0  0.0
1  0.691172  0.099081  0.338893  0.0  2.0  1.0
2  0.783475  0.238099  0.427903  1.0  2.0  0.0
3  0.241634  0.954246  0.338797  1.0  2.0  1.0

B_df的样本输出(X是列,Z是行):

        0.0    1.0            
0.0  0.206623  0.783475
1.0  0.691172  0.241634

当前代码:

X = read_from_sql("SELECT DISTINCT X FROM master ORDER BY DESC")

Z = read_from_sql("SELECT DISTINCT Z FROM master ORDER BY DESC")

master_df = read_from_sql("SELECT * FROM master")

def zero_df_creator(index, column):
    '''
    Creates X_df, Y_df, Z_df, R_df, G_df, B_df a dataframe in the shape index x column. All values are zero.

    index = list of index values
    column = list of column values

    Returns: X_df, Y_df, Z_df, R_df, G_df, B_df
    '''

    X_df = pd.Dataframe(0.0, index=index, columns=column)
    Y_df = X_df.copy()
    Z_df = X_df.copy()
    R_df = X_df.copy()
    G_df = X_df.copy()
    B_df = X_df.copy()

    return X_df, Y_df, Z_df, R_df, G_df, B_df


X_df, Y_df, Z_df, R_df, G_df, B_df = zero_df_creator(Z, X)


def set_df_value(df_row):
    '''
    This function sorts XYZRGB values into their respective XZ coordinates for visualization. 
    This function uses pd.set_value due to its speed advantage (roughly twice as fast). 

    If set_value no longer works, change to df.at[index, column] = value  

    Returns: dataframe
    '''


    index = df_row['X']
    column = df_row['Z']

    X_df.set_value(index, column, df_row['X'])
    Y_df.set_value(index, column, df_row['Y'])
    Z_df.set_value(index, column, df_row['Z'])
    R_df.set_value(index, column, df_row['R'])
    G_df.set_value(index, column, df_row['G'])
    B_df.set_value(index, column, df_row['B'])

master_df.apply(set_df_value, axis=1)

1 个答案:

答案 0 :(得分:0)

所以你有一个看起来像这样的DataFrame:

positions = np.vstack(([0, 0, 1, 1], [2] * 4, [0, 1] * 2))
data = np.vstack((positions, np.random.rand(3, 4)))
df = pd.DataFrame(dict(zip('xyzrgb', data)))

df

返回

          b         g         r    x    y    z
0  0.206623  0.385774  0.228514  0.0  2.0  0.0
1  0.691172  0.099081  0.338893  0.0  2.0  1.0
2  0.783475  0.238099  0.427903  1.0  2.0  0.0
3  0.241634  0.954246  0.338797  1.0  2.0  1.0

不是为每个属性创建单独的数据框,而是只需set the index即可获得有用的表示形式:

df.set_index(['x', 'z'])

返回

                b         g         r    y
x   z                                     
0.0 0.0  0.206623  0.385774  0.228514  2.0
    1.0  0.691172  0.099081  0.338893  2.0
1.0 0.0  0.783475  0.238099  0.427903  2.0
    1.0  0.241634  0.954246  0.338797  2.0