Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧行比例_Python_Pandas - Fatal编程技术网

Python 数据帧行比例

Python 数据帧行比例,python,pandas,Python,Pandas,我有一个包含多个列和行的数据框架 对于所有列,我需要说行值等于此行的0.5+行的0.5 befores值 我目前设置了一个正在运行的循环。但是我觉得有一个更好的方法不用循环。有人有什么想法吗 数据帧=df_输入 df_output=df_input.copy() for i in range(1, df_input.shape[0]): try: df_output.iloc[[i]]= (df_input.iloc[[i-1]]*(1/2)).values+(df_in

我有一个包含多个列和行的数据框架

对于所有列,我需要说行值等于此行的0.5+行的0.5 befores值

我目前设置了一个正在运行的循环。但是我觉得有一个更好的方法不用循环。有人有什么想法吗

数据帧=df_输入

df_output=df_input.copy()
for i in range(1, df_input.shape[0]):
    try:
        df_output.iloc[[i]]= (df_input.iloc[[i-1]]*(1/2)).values+(df_input.iloc[[i]]*(1/2)).values
    except:
        pass

你的意思是这样的吗

首先创建测试数据:

np.random.seed(42)

df = pd.DataFrame(np.random.randint(0, 20, [5, 3]), columns=['A', 'B', 'C'])

    A   B   C
0   6  19  14
1  10   7   6
2  18  10  10
3   3   7   2
4   1  11   5
您请求的功能:

(df*.5).rolling(2).sum()

      A     B     C
0   NaN   NaN   NaN
1   8.0  13.0  10.0
2  14.0   8.5   8.0
3  10.5   8.5   6.0
4   2.0   9.0   3.5
def weighted_mean(arr):
    return sum(arr*[.25, .75])

df.rolling(2).apply(weighted_mean, raw=True)

       A      B     C
0    NaN    NaN   NaN
1   9.00  10.00  8.00
2  16.00   9.25  9.00
3   6.75   7.75  4.00
4   1.50  10.00  4.25
编辑: 对于不平衡和,可以定义一个辅助函数:

(df*.5).rolling(2).sum()

      A     B     C
0   NaN   NaN   NaN
1   8.0  13.0  10.0
2  14.0   8.5   8.0
3  10.5   8.5   6.0
4   2.0   9.0   3.5
def weighted_mean(arr):
    return sum(arr*[.25, .75])

df.rolling(2).apply(weighted_mean, raw=True)

       A      B     C
0    NaN    NaN   NaN
1   9.00  10.00  8.00
2  16.00   9.25  9.00
3   6.75   7.75  4.00
4   1.50  10.00  4.25
EDIT2: …如果应在运行时设置权重:

def weighted_mean(arr, weights=[.5, .5]):
    return sum(arr*weights/sum(weights))
没有其他参数默认为平衡平均值:

df.rolling(2).apply(weighted_mean, raw=True)

      A     B     C
0   NaN   NaN   NaN
1   8.0  13.0  10.0
2  14.0   8.5   8.0
3  10.5   8.5   6.0
4   2.0   9.0   3.5
不平衡的平均数:

df.rolling(2).apply(weighted_mean, raw=True, args=[[.25, .75]])

       A      B     C
0    NaN    NaN   NaN
1   9.00  10.00  8.00
2  16.00   9.25  9.00
3   6.75   7.75  4.00
4   1.50  10.00  4.25
除以总和(权重)可以定义权重,不仅限于一的分数,还可以定义任何比率:

df.rolling(2).apply(weighted_mean, raw=True, args=[[1, 3]])

       A      B     C
0    NaN    NaN   NaN
1   9.00  10.00  8.00
2  16.00   9.25  9.00
3   6.75   7.75  4.00
4   1.50  10.00  4.25

你的意思是这样的吗

首先创建测试数据:

np.random.seed(42)

df = pd.DataFrame(np.random.randint(0, 20, [5, 3]), columns=['A', 'B', 'C'])

    A   B   C
0   6  19  14
1  10   7   6
2  18  10  10
3   3   7   2
4   1  11   5
您请求的功能:

(df*.5).rolling(2).sum()

      A     B     C
0   NaN   NaN   NaN
1   8.0  13.0  10.0
2  14.0   8.5   8.0
3  10.5   8.5   6.0
4   2.0   9.0   3.5
def weighted_mean(arr):
    return sum(arr*[.25, .75])

df.rolling(2).apply(weighted_mean, raw=True)

       A      B     C
0    NaN    NaN   NaN
1   9.00  10.00  8.00
2  16.00   9.25  9.00
3   6.75   7.75  4.00
4   1.50  10.00  4.25
编辑: 对于不平衡和,可以定义一个辅助函数:

(df*.5).rolling(2).sum()

      A     B     C
0   NaN   NaN   NaN
1   8.0  13.0  10.0
2  14.0   8.5   8.0
3  10.5   8.5   6.0
4   2.0   9.0   3.5
def weighted_mean(arr):
    return sum(arr*[.25, .75])

df.rolling(2).apply(weighted_mean, raw=True)

       A      B     C
0    NaN    NaN   NaN
1   9.00  10.00  8.00
2  16.00   9.25  9.00
3   6.75   7.75  4.00
4   1.50  10.00  4.25
EDIT2: …如果应在运行时设置权重:

def weighted_mean(arr, weights=[.5, .5]):
    return sum(arr*weights/sum(weights))
没有其他参数默认为平衡平均值:

df.rolling(2).apply(weighted_mean, raw=True)

      A     B     C
0   NaN   NaN   NaN
1   8.0  13.0  10.0
2  14.0   8.5   8.0
3  10.5   8.5   6.0
4   2.0   9.0   3.5
不平衡的平均数:

df.rolling(2).apply(weighted_mean, raw=True, args=[[.25, .75]])

       A      B     C
0    NaN    NaN   NaN
1   9.00  10.00  8.00
2  16.00   9.25  9.00
3   6.75   7.75  4.00
4   1.50  10.00  4.25
除以总和(权重)可以定义权重,不仅限于一的分数,还可以定义任何比率:

df.rolling(2).apply(weighted_mean, raw=True, args=[[1, 3]])

       A      B     C
0    NaN    NaN   NaN
1   9.00  10.00  8.00
2  16.00   9.25  9.00
3   6.75   7.75  4.00
4   1.50  10.00  4.25
这将对所有列执行相同的操作

说明:对于每个滚动对象,lambda选择列,
x
的结构类似于所有列的
[this\u col[i],this\u col[i+1]]
,然后执行自定义算术是很简单的

这将对所有列执行相同的操作

说明:对于每个滚动对象,lambda选择列,
x
的结构类似于所有列的
[this\u col[i],this\u col[i+1]]
,然后执行自定义算法非常简单。

将熊猫作为pd导入
将numpy作为np导入
df=pd.DataFrame(np.random.randint(低=0,高=10,大小=(5,1)),列=['a'])
df[“cumsum_a”]=0.5*df[“a”].cumsum()+0.5*df[“a”]

将熊猫作为pd导入
将numpy作为np导入
df=pd.DataFrame(np.random.randint(低=0,高=10,大小=(5,1)),列=['a'])

df[“cumsum_a”]=0.5*df[“a”].cumsum()+0.5*df[“a”]
使用pandas.DataFrame.shift创建一列,然后使用
0.5*cur_val+0.5*lag_val
创建最后一列。不需要循环,应该非常快,然后您只需删除不需要的列。您的问题中没有示例数据,因此我不提供示例解决方案。非常感谢。你认为这对多列有效吗?是的,不确定如何制作一个示例数据帧。只知道如何在CSVS中加载你是什么意思?您是否需要像
0.5*cur\u val+0.5 lag\u val\u 1+0.5*lag\u val\u 2+…+这样的复杂计算0.5*滞后值
?啊,明白了。隐马尔可夫模型。。。向量化函数可以执行元素计算,可以应用于循环中的每一列,这可能会更好。因此,基本上,您希望编写一个函数,它接收整列数据,然后稍微偏移它,这样您就有了
x1=col1[1://code>和
x2=col1[:-1]
,然后执行
0.5*x1+0.5*x2
,这将按元素操作。然后,您可以在每个列上循环并将其输入此函数以返回结果。使用
pandas.DataFrame.shift
创建列,然后使用
0.5*cur\u val+0.5*lag\u val
创建最后一列。不需要循环,应该非常快,然后您只需删除不需要的列。您的问题中没有示例数据,因此我不提供示例解决方案。非常感谢。你认为这对多列有效吗?是的,不确定如何制作一个示例数据帧。只知道如何在CSVS中加载你是什么意思?您是否需要像
0.5*cur\u val+0.5 lag\u val\u 1+0.5*lag\u val\u 2+…+这样的复杂计算0.5*滞后值
?啊,明白了。隐马尔可夫模型。。。向量化函数可以执行元素计算,可以应用于循环中的每一列,这可能会更好。因此,基本上,您希望编写一个函数,它接收整列数据,然后稍微偏移它,这样您就有了
x1=col1[1://code>和
x2=col1[:-1]
,然后执行
0.5*x1+0.5*x2
,这将按元素操作。然后,您可以在每个列上循环,并将其输入此函数以返回结果。是的,这看起来很完美。我真的不明白你是怎么做到的,因为我认为滚动是为了移动平均线。但这看起来不错。还有一个更复杂的问题,那就是它并不总是0.5:0.5。未来可能会变为0.25:0.75
滚动
不是滚动平均值,而是滚动窗口。平均值应该是
rolling(2).mean()
-但是在这个滚动窗口后面可以有不同的聚合函数是的,这看起来很完美。我真的不明白你是怎么做到的,因为我认为滚动是为了移动平均线。但这看起来不错。还有一个更复杂的问题,那就是它并不总是0.5:0.5。未来可能会变为0.25:0.75
滚动
不是滚动平均值,而是滚动窗口。平均值应该是
rolling(2).mean()
——但是在这个滚动窗口后面可以有不同的聚合函数