我使用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))
其中第一个和第二个是特定列。 现在我想让它不那么具体。我试过了
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行,所以我不能手动完成。
答案 0 :(得分:3)
在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
答案 1 :(得分: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))