2016-09-09 32 views
2

我使用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()来过滤第一列中的唯一值,数组“独特”。我创建了一个循环,在定义唯一值时起作用:

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

其中第一个和第二个是特定列。 现在我想让它不那么具体。我试过

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) 

但它只返回原来的第二列。 有没有人有关于如何使此代码非特定的想法?实际上,我有大约70,000行,所以我不能手动完成。

+0

你执着于使用纯numpy的?这在大熊猫中是微不足道的(你要求一个“groupby”操作)。 – DSM

+0

数据文件是什么样的? – wwii

+0

这是一个表格.txt 我在下面的答案中提到了熊猫的答案,结果很好。我以前不知道这件事。 – Maurus

回答

1

在大熊猫,您可以通过使用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 
+0

惊人的,thakns为您的快速答案! – 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)) 
+0

好的,谢谢! – Maurus

相关问题