我有以下数据集。
我的目的是将第2栏中的数值替换为两个连续数值的平均值,当第1栏的数值小于5而大于6时。准确地说,在<5范围内,第1栏的数值是1、2、3和4,相应的第2栏的数值是10、20、30、40。所以,我想取平均值(10,20)=15和(30,40)=35。对于第1列,我想在范围>6的范围内做同样的操作,取相应的第2列值的平均值(70,80)=75和(80,90)=95。当第1列值不属于这两个范围(5和6)和相应的第2列值(50和60)时,我将不取第2列值的平均值,最后根据这三种条件创建列2值的数组。
我尝试了以下方法:
import numpy as np
import pandas as pd
data= pd.read_table('/Users/Hrihaan/Desktop/Data.txt', dtype=float, header=None, sep='\s+').values
t=data[:,0]
df = pd.DataFrame({"x":t, "y":data[:,1]})
x=np.where(t<=4,data[:,1],np.nan)
x_1=np.nanmean(x.reshape(-1, 2), axis=1)
y=np.where((df.x>4)&(df.x<7), df.y,np.nan)
z=np.where(t>6,data[:,1],np.nan)
z_1=np.nanmean(z.reshape(-1, 2), axis=1)
A=np.concatenate((x_1,y,z_1), axis=0)
print(A)我得到了以下输出:15.35。南50。60。南南7595.
我的预期产出是:15.35。50。60。75。95.
任何关于如何在我的代码中绕过np.nan的帮助都会很有帮助。
发布于 2018-01-31 18:49:12
我真的很难在这里看到你更大的概念。对于您非常具体的问题,这样做是可行的:
import pandas as pd
#read your file
data= pd.read_table('test.txt', dtype = float, delim_whitespace = True, names = ["x", "y"])
#define rows you want to exclude
exclude_rows = set([5, 6])
#create new column with rolling mean of two rows
data["mean"] = data["y"].rolling(2).mean()
#overwrite rolling mean, when row should be excluded from calculating the average
data["mean"][data["x"].isin(exclude_rows)] = data["y"]
#filter data
A = data["mean"][(data["x"].isin(exclude_rows)) | (data["x"] % 2 == 0)]但是,如果要排除例如x=4和6,那么预期的输出是什么呢?然后你有几个奇异值,你没有给出任何指示,它们在平均过程中应该发生什么。
发布于 2018-01-31 17:02:04
这能做你想做的
a=np.vstack((np.arange(1,11),np.arange(10,110,10))).T
b=(a[:-1,1]+a[1:,1])/2
indL=np.argmax(a[:,0]>5)-1
indH=np.argmax(a[:,0]>6)
out=np.hstack((b[:indL:2],a[indL:indH,1],b[indH::2]))https://stackoverflow.com/questions/48547081
复制相似问题