在列表中查找值的平均值

时间:2016-05-10 15:54:04

标签: python numpy mean mathematical-expressions

我正在尝试在两列中找到值的平均值。

输入:

tweetcricscore  34 #afgvssco   51
tweetcricscore  23 #afgvszim   46
tweetcricscore  24 #banvsire   12
tweetcricscore  456 #banvsned  46
tweetcricscore  653 #canvsnk   1
tweetcricscore  789 #cricket   178
tweetcricscore  625 #engvswi   46
tweetcricscore  86 #hkvssco    23
tweetcricscore  3 #indvsban    1
tweetcricscore  87 #sausvsvic  8
tweetcricscore  98 #wt20       56

我试图横向找到col[1]col[3]的平均值。即

34 + 51 / 2 = 42.5

代码:

data = np.genfromtxt('keyword.csv', delimiter=',', comments=None)

d0=data[:,1]
d1=data[;,3]

并将d2中的输出col[4]写入同一输入文件中。

我可以找到许多样本用于平均值的垂直计算但不能找到水平。不要对数组进行排序,因为这两个值相对于col[0]col[2].彼此相关。任何建议都值得赞赏。

提前致谢。

2 个答案:

答案 0 :(得分:3)

您可以在Pandas中轻松完成此操作:

import pandas as pd

df = pd.read_csv('keyword.csv', header = None)

df.columns = ['col1','col2','col3','col4']

df['avgCol'] = (df['col2'] + df['col4'])/2

答案 1 :(得分:1)

在numpy中,您可以使用np.mean完成此操作(请参阅文档here。您可以在任一轴上运行此操作; 0表示垂直,1表示水平。技巧是您需要删除列而不使用首先运行你的行data = np.genfromtxt('keyword.csv', delimiter=',', comments=None)然后删除带有文本的列。在这种情况下,列0和2,所以你可以使用data2 = np.delete(data, np.s_[::2], 1)删除从0开始的每一行。一旦你有这个然后,您可以使用d3 = np.mean(data2, axis=1)并获得所需方法的数组。要将其作为原始数据中的第四列,请使用data = np.insert(data, data.shape[1], d3, axis=1)

所有在一起:

data = np.genfromtxt('keyword.csv', delimiter=',', comments=None)
data2 = np.delete(data, np.s_[::2], 1)
d3 = np.mean(data2, axis=1)
data = np.insert(data, data.shape[1], d3, axis=1)

我对此最大的警告是data2行,它只适用于以您显示的方式构建的表格。如果你有更多的列或列没有被排序为text,float,text,float,...你将不得不重写它以正确删除带有文本的列。如有必要,您可以编写一个脚本,以便在加载到numpy数组中后搜索具有NaN值的列。例如,np.all(np.isnan(data),axis = 0)将返回一个具有True,False值的1-d数组,以确定列中的所有值是否为nan。然后,您可以使用它来删除索引处的值,其值为true。

功能:

indices = np.all(np.isnan(data), axis=0)
indices = np.where(indices == True)
data2 = np.delete(data, np.s_[indices[0]],1)

Pandas很棒,因为它会自动忽略带有平均值文本的列。它使这个计算更加简单:

import pandas as pd
df = pd.read_csv('keywords.csv', header=None)
df[df.shape[1]] = df.mean(axis=1)

这会在数据框的末尾创建一个新列,其中包含该行中整数/浮点值的平均值。