我有两个文件:
文件 1:
key.1 10 6
key.2 5 6
key.3. 5 8
key.4. 5 10
key.5 4 12
文件 2:
key.1 10 6
key.2 6 6
key.4 5 10
key.5 2 8
我有一个相当复杂的问题。我想对每个位置的两个文件进行平均。 ID。但是,如果其中一个文件的 ID 是唯一的,我只想将该值保留在输出文件中。所以输出文件看起来像这样:
key.1 10 6
key.2 5.5 6
key.3. 5 8
key.4. 5 10
key.5 3 10
这是一个例子。实际上,我想对 100 列进行平均。
最佳答案
以下解决方案使用 Pandas,并假设您的数据存储在纯文本文件“file1.txt”和“file2.txt”中。让我知道这个假设是否不正确 - 可能是针对不同文件类型进行的最小编辑。如果我误解了你对"file"这个词的意思,而你的数据已经在 DataFrames 中,你可以忽略第一步。
首先将数据读入DataFrames:
import pandas as pd
df1 = pd.read_table('file1.txt', sep=r'\s+', header=None)
df2 = pd.read_table('file2.txt', sep=r'\s+', header=None)
给我们:
In [9]: df1
Out[9]:
0 1 2
0 key.1 10 6
1 key.2 5 6
2 key.3 5 8
3 key.4 5 10
4 key.5 4 12
In [10]: df2
Out[10]:
0 1 2
0 key.1 10 6
1 key.2 6 6
2 key.4 5 10
3 key.5 2 8
然后在第 0 列加入这些数据集:
combined = pd.merge(df1, df2, 'outer', on=0)
给予:
0 1_x 2_x 1_y 2_y
0 key.1 10 6 10.0 6.0
1 key.2 5 6 6.0 6.0
2 key.3 5 8 NaN NaN
3 key.4 5 10 5.0 10.0
4 key.5 4 12 2.0 8.0
这有点乱,但是我们可以在计算后只选择我们想要的列:
combined[1] = combined[['1_x', '1_y']].mean(axis=1)
combined[2] = combined[['2_x', '2_y']].mean(axis=1)
只选择有用的列:
results = combined[[0, 1, 2]]
这给了我们:
0 1 2
0 key.1 10.0 6.0
1 key.2 5.5 6.0
2 key.3 5.0 8.0
3 key.4 5.0 10.0
4 key.5 3.0 10.0
我相信这就是您要找的东西。
您没有说明您希望输出的文件格式是什么,但下面将为您提供一个制表符分隔的文本文件。让我知道是否有不同的偏好,我可以编辑。
results.to_csv('output.txt', sep='\t', header=None, index=False)
我应该补充一点,最好为您的列提供相关标签,而不是像我在本例中那样使用数字 - 我只是在此处使用默认整数值,因为我对您的数据集一无所知。
关于python - 平均文件之间的值,但保留不匹配的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49518655/