另一列唯一值的列中数值的平均值

5

我将使用Python 2.7(Anaconda)处理表格数据。我已经加载了一个带有两列的文本文件,例如:

[[ 1.  8.]
 [ 2.  4.]
 [ 3.  1.]
 [ 4.  5.]
 [ 5.  6.]
 [ 1.  9.]
 [ 2.  0.]
 [ 3.  7.]
 [ 4.  3.]
 [ 5.  2.]]

我的目标是计算第二列中与第一列唯一值匹配的所有值的平均值,例如1的平均值为8.5,2的平均值为2,3的平均值为4。 首先,我通过提取列并应用np.unique()来过滤第一列中的唯一值,得到数组“unique”。我创建了一个循环,当我定义唯一值时它可以工作:

mean= 0
values=[]
for i in range(0,len(first),1):
    if first[i]==1:
        values.append(second[i])
print(np.mean(values))

这里的first和second是特定的列名。现在我想让它们不那么具体化。我尝试过

mean = 0
values = []
means=[]

for i in unique:
    for k in range(0,len(first),1):
        if first[k]==i:
            values.append(second[k])
            mean = np.mean(values)
            means.append(mean)
    mean=0
    values=[]
print(means)

但它只返回原始的第二列。有人有什么想法可以使这段代码不具体化吗?实际上,我有大约70k行,无法手动完成。


你是否一定要使用纯numpy?在pandas中这很简单(你需要一个“groupby”操作)。 - DSM
数据文件长什么样? - wwii
这是一个表格化的 .txt 文件。 我尝试了下面提到 pandas 的答案,效果很好。我之前不知道这个方法。 - Maurus
2个回答

4
在pandas中,您可以通过使用groupby来实现此目的:
In [97]: data
Out[97]: 
array([[ 1.,  8.],
       [ 2.,  4.],
       [ 3.,  1.],
       [ 4.,  5.],
       [ 5.,  6.],
       [ 1.,  9.],
       [ 2.,  0.],
       [ 3.,  7.],
       [ 4.,  3.],
       [ 5.,  2.]])

In [98]: import pandas as pd

In [99]: df = pd.DataFrame(data, columns=['first', 'second'])

In [100]: df.groupby('first').mean().reset_index()
Out[100]: 
   first  second
0    1.0     8.5
1    2.0     2.0
2    3.0     4.0
3    4.0     4.0
4    5.0     4.0

惊人的,谢谢你的快速回答! - Maurus

1

编写一个比较语句,检查第一列是否包含您的唯一值,并将该语句用作boolean index

>>> mask = a[:,0] == 1
>>> a[mask]
array([[ 1.,  8.],
       [ 1.,  9.]])

for n in np.unique(a[:,0]):
    mask = a[:,0] == n
    print(np.mean(a[mask], axis = 0))

>>> 
[ 1.   8.5]
[ 2.  2.]
[ 3.  4.]
[ 4.  4.]
[ 5.  4.]

如果您的数据文件看起来像这样:

'''
1.,  8.
2.,  4.
3.,  1.
4.,  5.
'''

你其实不需要一个numpy数组,只需使用一个字典:

import collections
d = collections.defaultdict(list)
with open('file.txt') as f:
    for line in f:
        line = line.strip()
        first, second = map(float, line.split(','))
        d[first].append(second)

for first, second in d.iteritems():
    print(first, sum(second) / len(second))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接