Pandas 的半标准差
Semi Standard Deviation in Pandas
您好,我正在尝试编写一个函数来计算半标准偏差。但是,我正在努力将小于平均值的值附加到新数据框以进行计算。
def semistand(data,start,end):
df = data.loc[(str(start)):(str(end))]
lessthan=pd.DataFrame()
mean_df= df.mean()
for ind in df.index:
if ind in df.index<mean_df:
lessthan.append(df[index])
return(mean_df,lessthan)
我是 pandas 的新手,我发现它很难掌握!
你的函数中的问题是当你试图检索所需值的索引时。事实上,你写的是:df.index<mean_df
由于以下几个原因无法工作:
首先,mean_df 是一个 Pandas.Series
并且包含数据框所有列的均值。所以你不能将一个整数与一个系列进行比较(因为它真的没有意义)。
其次,让我们假设您的 data
是一个单独的列来删除第一点。然后你试图将你的索引与你的数据的平均值进行比较,我认为这不是你的 objective。您需要比较数据框中的值。
这是一个使用 pandas 系列的例子:
my_df = pd.Series([1,3,2,4])
my_df[my_df<my_df.mean()]
0 1
2 2
dtype: int64
否则使用整个数据框:
my_df = pd.DataFrame()
my_df['a'] = [1,3,2,4]
my_df['b'] = [3,1,4,2]
my_df[my_df < my_df.mean()]
a b
0 1.0 NaN
1 NaN 1.0
2 2.0 NaN
3 NaN 2.0
您无需将小于均值的值附加到新数据框。相反,您可以尝试这样的事情:
import pandas as pd
values = values = [ 24, 87, 30, 73, 98, 84, 75, 21, 90, 70, 99, 83, 28, 37, 28, 79, 43, 40, 64, 41]
df = pd.DataFrame({'a':values})
df[df['a'] < df['a'].mean()]['a'].std()
7.986099033807293
您好,我正在尝试编写一个函数来计算半标准偏差。但是,我正在努力将小于平均值的值附加到新数据框以进行计算。
def semistand(data,start,end):
df = data.loc[(str(start)):(str(end))]
lessthan=pd.DataFrame()
mean_df= df.mean()
for ind in df.index:
if ind in df.index<mean_df:
lessthan.append(df[index])
return(mean_df,lessthan)
我是 pandas 的新手,我发现它很难掌握!
你的函数中的问题是当你试图检索所需值的索引时。事实上,你写的是:df.index<mean_df
由于以下几个原因无法工作:
首先,mean_df 是一个 Pandas.Series
并且包含数据框所有列的均值。所以你不能将一个整数与一个系列进行比较(因为它真的没有意义)。
其次,让我们假设您的 data
是一个单独的列来删除第一点。然后你试图将你的索引与你的数据的平均值进行比较,我认为这不是你的 objective。您需要比较数据框中的值。
这是一个使用 pandas 系列的例子:
my_df = pd.Series([1,3,2,4])
my_df[my_df<my_df.mean()]
0 1
2 2
dtype: int64
否则使用整个数据框:
my_df = pd.DataFrame()
my_df['a'] = [1,3,2,4]
my_df['b'] = [3,1,4,2]
my_df[my_df < my_df.mean()]
a b
0 1.0 NaN
1 NaN 1.0
2 2.0 NaN
3 NaN 2.0
您无需将小于均值的值附加到新数据框。相反,您可以尝试这样的事情:
import pandas as pd
values = values = [ 24, 87, 30, 73, 98, 84, 75, 21, 90, 70, 99, 83, 28, 37, 28, 79, 43, 40, 64, 41]
df = pd.DataFrame({'a':values})
df[df['a'] < df['a'].mean()]['a'].std()
7.986099033807293