我正在尝试在两列中找到值的平均值。
输入:
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].
彼此相关。任何建议都值得赞赏。
提前致谢。
答案 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)
这会在数据框的末尾创建一个新列,其中包含该行中整数/浮点值的平均值。