【问题标题】:Forming an array from column values based on a different column value condition根据不同的列值条件从列值形成数组
【发布时间】:2018-07-10 20:28:41
【问题描述】:

我有以下数据集。

  1. 10
  2. 20
  3. 30
  4. 40
  5. 50
  6. 60
  7. 70
  8. 80
  9. 90
  10. 100

当第 1 列中的值保持小于 5 且大于 6 时,我的目标是用两个连续值的平均值替换第 2 列中的值。准确地说,在 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. 楠楠楠楠 楠楠楠75. 95.]

我的预期输出是: [15. 35. 50. 60. 75. 95.]

任何关于如何在我的代码中绕过 np.nan 的帮助都会非常有帮助。

【问题讨论】:

  • 我没有得到预期的输出。你说,你想替换第 2 列中的值,但是你的输出会生成更少的元素。
  • 感谢您的评论,我再次运行了我的代码,我得到了上面提到的输出@Piinthesky
  • 您的预期输出有六个元素,但您想替换十个值。还是您的预期输出是一个包含六个元素的 numpy 数组?
  • 是的,我的输出现在将是 6 个元素而不是 10 个,我正在根据三个条件缩小 Column2。

标签: python numpy conditional-statements average multiple-columns


【解决方案1】:

这就是你想要的

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]))

【讨论】:

    【解决方案2】:

    我真的很难在这里看到你更大的概念。对于您非常具体的问题,这将起作用:

    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,您的预期输出是什么?然后你有几个奇异值,你没有给出任何指示,在平均过程中它们应该发生什么。

    【讨论】:

    • 感谢您的建议,我的概念是除了对应的 5 和 6 的值,所有其他 Column 2 的值都基于 Column 1 (1,2,3,4,7,8,9, 10) 将取两个连续值的平均值。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多