Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧平均值真正唯一的值_Python_Pandas_Join_Merge - Fatal编程技术网

Python 数据帧平均值真正唯一的值

Python 数据帧平均值真正唯一的值,python,pandas,join,merge,Python,Pandas,Join,Merge,我正在处理许多度量集,每个度量集包含两个值:日期时间和温度。例如: # 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 | 1

我正在处理许多度量集,每个度量集包含两个值:日期时间和温度。例如:

# 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),并且没有在完全相同的时间进行测量(例如,可以关闭几分钟)

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


要在同一列上获取值1、值2和值3,我使用了:

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
解决它:

我首先连接了所有无重复项:

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()

这将得到正确的平均值。

如果测量值的时间都相同-因此包含相同数量的数据点,您可以忽略时间戳并简单地合并列表,计算行平均值。遗憾的是,测量值在时间上可能会有很大差异。有些是一周,有些是一年,它们也不一定一致(我可以有上周的一组和一年前的一组),但测量的时间间隔是常数吗然后,你可以把它当作一个序列,而不考虑时间信息。你只有时间部分还是日期部分?如果你只有部分时间,你将如何加入不同日子的测量?您可以发布包含您在评论中提到的不准确信息的可复制数据集吗?您可以附加它们,而不是合并datraframe,然后按(平均值)进行分组,这样我就可以在两列中列出所有值(时间和值)。但是,它不创建平均值,而忽略了双测量值。简单地说:1)应该过滤掉日期时间和测量值完全相同的情况。值不同的情况可能会有不同的日期时间,应该应用10分钟的范围来考虑这些值来计算平均值。@Yorian,那么,你的意思是说你想把属于指定范围
datetime
interval的值合并,比如10分钟?是的,我想取10分钟时间范围内的平均值。但是,我还想过滤掉双重测量值(在完全相同的时间完全相同的值)