Python 数据帧行比例
我有一个包含多个列和行的数据框架 对于所有列,我需要说行值等于此行的0.5+行的0.5 befores值 我目前设置了一个正在运行的循环。但是我觉得有一个更好的方法不用循环。有人有什么想法吗 数据帧=df_输入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
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()
——但是在这个滚动窗口后面可以有不同的聚合函数