【问题标题】:Pandas dataframe average truly unique values熊猫数据框平均真正唯一的值
【发布时间】:2017-03-28 07:24:58
【问题描述】:

我正在使用多个测量集,每个测量集包含两个值:日期时间和温度。示例:

# measurement 1:
    time | value
00:00:00 | 10.1
00:00:10 | 10.12
00:00:20 | 10.14
00:00:30 | 10.12
00:00:40 | 10.11
00:00:50 | 10.13

# measurement 2:
    time | value
00:00:01 | 10.11
00:00:11 | 10.13
00:00:21 | 10.14
00:00:31 | 10.12
00:00:41 | 10.12
00:00:51 | 10.11

# measurement 3:
    time | value
00:00:00 | 10.2
00:00:10 | 10.22
00:00:20 | 10.24
00:00:30 | 10.22
00:00:40 | 10.21
00:00:50 | 10.23

我将这些集合加载到 pandas 数据帧中,并使用外连接将它们合并到一个数据帧中:

df = pd.merge(left=df1, right=df2, how='outer', left_on='time', right_on='time', suffixes=("1", "2"))

我想平均三个数据帧的值,但是: 有时时间不完全相同,导致不同行上的值难以取平均值。以测量 2 和测量 3 的连接为例:

# measurement 2 & 3 merged:
    time | value2 | value3
00:00:01 | 10.11  | -
00:00:11 | 10.13  | -
00:00:21 | 10.14  | -
00:00:31 | 10.12  | -
00:00:41 | 10.12  | -
00:00:51 | 10.11  | -
00:00:00 | -      | 10.2
00:00:10 | -      | 10.22
00:00:20 | -      | 10.24
00:00:30 | -      | 10.22
00:00:40 | -      | 10.21
00:00:50 | -      | 10.23

在这种情况下,时间并不完全相同,有没有办法将它们放在同一行以便平均?

有时设备会多次(在不同时间)导出数据。这意味着某些测量值不是唯一的(完全相同的时间和完全相同的值)。我如何确保在平均时不考虑这些(双重)测量值?

希望有人能提供帮助。

编辑:添加图片和一些说明 我已经绘制了六个数据集。为了能够更好地解释,我在不同的图表中添加了 0、10、20、30、40 和 50,因为否则有些会相互重叠。黄色、洋红色和青色测量值在值和日期时间上完全重叠,因为它们来自同一来源(除了数据被多次导出)。

绿色和红色数据集的值不同(大约 40)并且没有在完全相同的时间进行测量(例如可以相差几分钟)。

我想从所有这些测量中创建平均线。由于洋红色、青色和黄色是相同的,因此平均值应该是它们的值之一。但从某个角度来看,有蓝色、绿色和红色。在这种情况下,我正在寻找计算出的平均值,但日期时间并不完全相同。

【问题讨论】:

  • 如果测量的时间都一样长 - 因此包含相同数量的数据点,您可以忽略时间戳并简单地合并列表,计算逐行平均值
  • 遗憾的是,测量值在时间上可能会有很大差异。有些是一周长,有些是一年,它们也不一定一致(我可以有一组上周的和一年前的)
  • 测量的时间间隔还固定吗? - 然后你可以把它当作一个序列而不考虑时间信息
  • 你只有时间部分还是日期部分?如果你只有时间部分 - 你将如何加入不同日子的测量?您能否发布可重现的数据集,涵盖您在 cmets 中提到的不准确之处?
  • 您可以附加它们而不是合并 datraframe,然后按(平均)进行分组

标签: python pandas join merge


【解决方案1】:

解决了:

我首先连接了所有不重复的条目:

for idf, df in enumerate(data[:-1]):
if idf == 0:
    df_new = data[idf]
df_new = pd.concat([df_new, data[idf+1][(~(data[idf+1].datetime.isin(df_new.datetime)) | ~(data[idf+1].value.isin(df_new.value)))]])

然后我设置索引:

df_new = df_new.set_index('datetime')

最后我重新采样并取平均值:

avg = df_new.resample('1800s').mean().dropna()

这会产生正确的平均值。

【讨论】:

    【解决方案2】:

    为了在同一列上获取 value1、value2 和 value3,我使用了:

    df = pd.concat([df1, df2, df3])
    

    下面的例子看起来像你的:

    import pandas as pd
    
    df1 = pd.DataFrame({'Time': ['00:00:00', '00:00:10', '00:00:20', '00:00:30', '00:00:40', '00:00:50'],
                        'Value': ['10', '1', '2', '3', '4', '8']})
    
    
    df2 = pd.DataFrame({'Time': ['00:00:01', '00:00:11', '00:00:21', '00:00:31', '00:00:41', '00:00:51'],
                        'Value': ['10', '1', '2', '3', '4', '8']})
    
    
    df3 = pd.DataFrame({'Time': ['00:00:00', '00:00:10', '00:00:20', '00:00:30', '00:00:40', '00:00:50'],
                        'Value': ['10', '1', '2', '3', '4', '8']})
    
    df = pd.concat([df1, df2, df3])
    
    print(df):
           Time Value
    0  00:00:00    10
    1  00:00:10     1
    2  00:00:20     2
    3  00:00:30     3
    4  00:00:40     4
    5  00:00:50     8
    0  00:00:01    10
    1  00:00:11     1
    2  00:00:21     2
    3  00:00:31     3
    4  00:00:41     4
    5  00:00:51     8
    0  00:00:00    10
    1  00:00:10     1
    2  00:00:20     2
    3  00:00:30     3
    4  00:00:40     4
    5  00:00:50     8
    

    【讨论】:

    • 这给我留下了两列(时间和价值)中的所有值。然而,它不会在忽略双重测量的同时创建平均值。所以简单地说:1)应该过滤掉日期时间和测量值完全相同的情况。值不同的情况可能有不同的日期时间,应该应用 10 分钟的范围来考虑这些值来计算平均值。
    • @Yorian,所以,你的意思是说你想把落在datetime 间隔指定范围内的值组合起来,比如 10 分钟?
    • 是的,我想取 10 分钟时间范围内的值的平均值。但是我也想过滤掉双重测量(完全相同的值在完全相同的时间)
    猜你喜欢
    • 2018-05-15
    • 2021-03-10
    • 1970-01-01
    • 2020-04-26
    • 2018-02-01
    • 1970-01-01
    • 2018-10-26
    • 2018-11-16
    • 2013-02-14
    相关资源
    最近更新 更多