首页 > 解决方案 > 对齐和填充不同长度和分辨率的数字列表的方法

问题描述

我有许多 n x 2 矩阵,如下所示:

距离 价值 距离.1 价值.1 ...
-15 1 -15 2 ...
-14.9 3 -14.995 4 ...
-14.8 4 -14.992 2 ...
... ... ... ... ...
15 3 8.959 2 ...
... ... ...
15.048 3 ...

距离列都从 -15 开始,都在 +15+-0.05 左右结束。

我的目标是计算(值列的)平均值,然后将这些值绘制为距离的函数。我坚持的是如何“对齐”所有距离,如下所示:

距离 价值 距离.1 价值.1 平均值
-15 1 -15 2 这个距离的平均值
-14.995 4 这个距离的平均值
... ... 这个距离的平均值
-14.8 4 -14.8 2 这个距离的平均值
... ... ... ... 这个距离的平均值
14.995 2 这个距离的平均值
15 2 15 3 这个距离的平均值

目前,我只是根据第一个距离列绘制所有值,这意味着列中比第一个矩阵长的所有数据点都将丢失。

这是一些代码。现在我知道这可以用 python 以外的其他语言解决,即使没有 pandas,但我在我的项目中使用它们来事先清理和过滤数据。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df0 = pd.DataFrame({'Distance':np.linspace(-15, 14.969, 100),
                        'Value':np.random.rand(100)})
df1 = pd.DataFrame({'Distance.1':np.linspace(-15, 15.034, 500),
                        'Value.1':np.random.rand(500)})

df = pd.concat([df0,df1], ignore_index=False, axis=1)

df['mean'] = df.filter(regex='Value').mean(axis=1)

df.plot(x='Distance', y='mean')
plt.show()

因此,使用上面的代码,距离没有对齐。我看到了两种解决问题的方法:

我认为,考虑到统计数据,第二种方法更好。因为使用第一种方法,与所有列中的距离值相比,仅出现在较长列中的值在平均值中的表现将被过度表示。

我猜想有一种非常聪明的方法可以将Lambda 表达式与 pandas 的DataFrame.apply结合使用。但我真的不知道该怎么做。(如何让 lambda 表达式查看除最长的列之外的所有列,反之亦然?如何将值添加到某些列而不是其他列?)

到目前为止,我已经想出了这个:

对于每一行,将距离列中的值与最长距离列的距离值进行比较。如果相同,则转到下一列,否则以某种方式插入 NaN 值并将下面行中的所有值向下移动,最长矩阵中的值除外(最长的两列)。

任何帮助表示赞赏。我敢肯定我不是第一个遇到这个问题的人,但我真的不知道如何用谷歌搜索它。

标签: pythonpandasdataframematrixposition

解决方案


推荐阅读