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

Mean of values in a column for unique values in another column

我正在使用 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)

但它只是 returns 原来的第二列。 有没有人知道如何使这段代码非特定?实际上,我有大约 70k 行,所以我无法手动完成。

在 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

写一个比较语句,检查第一列是否有你的唯一值,将该语句用作 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))