Pandas 数据框中的变量 运行 总数
Variable Running Total in Pandas dataframe
我正在尝试在 python 中创建一个函数,用户在其中输入一列有意义的完整值和一个数字,将其称为 X。然后该函数将在 X 上创建一个 运行 总数那些意味着全部价值超过。
例如,对于系列 A,且 X = 3:
import random
mylist = []
for i in range(0,100):
x = random.randint(1,10)
mylist.append(x)
a = pd.Series(mylist)
a.head()
Out:
0 2
1 5
2 2
3 8
4 8
5 6
所以 my_func() 会 return 这个新序列(作为第三列):
0 2 Nan
1 5 Nan
2 2 9 # 2+5+2
3 8 15 # 5+2+8
4 8 18 # 2+8+8
5 6 22 # 8+8+6
我想过以某种方式使用 cumsum()
,但无法理解其中的 X 部分。老实说,我不知道从哪里开始。
您可以使用 rolling sum 并指定 window(在您的情况下为 3)。
像这样的一些会起作用:
In [348]: df
Out[348]:
0 2
1 5
2 2
3 8
4 8
5 6
In [350]: df.rolling(window=3).sum()
Out[350]:
0 NaN
1 NaN
2 9.0
3 15.0
4 18.0
5 22.0
Name: A, dtype: float64
数据
df=pd.read_clipboard()
df
df['runningsum']=df.rolling(3).s.sum()
df
输出
不确定您是在研究更优化的 Pandas 还是 Numpy 解决方案,但为了完整起见,我在这里建议使用纯 python 版本的函数。它实现了一个生成器,因此在许多情况下,它可能是一个非常简单但高性能的选项,没有任何外部依赖:
def my_func2(data, x):
i = 1
for n in data:
if i < x:
yield 0 # ignore the first numbers
else:
yield sum(data[i-x:i]) # sum the current number and previous x-1 numbers.
i += 1
mylist = [2, 5, 2, 8, 8, 6]
# The enumerate() part is just a way to generate the counting on the left
for i, n in enumerate(my_func2(mylist, 3)):
print(f"{i:5}: {n:9}")
我正在尝试在 python 中创建一个函数,用户在其中输入一列有意义的完整值和一个数字,将其称为 X。然后该函数将在 X 上创建一个 运行 总数那些意味着全部价值超过。
例如,对于系列 A,且 X = 3:
import random
mylist = []
for i in range(0,100):
x = random.randint(1,10)
mylist.append(x)
a = pd.Series(mylist)
a.head()
Out:
0 2
1 5
2 2
3 8
4 8
5 6
所以 my_func() 会 return 这个新序列(作为第三列):
0 2 Nan
1 5 Nan
2 2 9 # 2+5+2
3 8 15 # 5+2+8
4 8 18 # 2+8+8
5 6 22 # 8+8+6
我想过以某种方式使用 cumsum()
,但无法理解其中的 X 部分。老实说,我不知道从哪里开始。
您可以使用 rolling sum 并指定 window(在您的情况下为 3)。 像这样的一些会起作用:
In [348]: df
Out[348]:
0 2
1 5
2 2
3 8
4 8
5 6
In [350]: df.rolling(window=3).sum()
Out[350]:
0 NaN
1 NaN
2 9.0
3 15.0
4 18.0
5 22.0
Name: A, dtype: float64
数据
df=pd.read_clipboard()
df
df['runningsum']=df.rolling(3).s.sum()
df
输出
不确定您是在研究更优化的 Pandas 还是 Numpy 解决方案,但为了完整起见,我在这里建议使用纯 python 版本的函数。它实现了一个生成器,因此在许多情况下,它可能是一个非常简单但高性能的选项,没有任何外部依赖:
def my_func2(data, x):
i = 1
for n in data:
if i < x:
yield 0 # ignore the first numbers
else:
yield sum(data[i-x:i]) # sum the current number and previous x-1 numbers.
i += 1
mylist = [2, 5, 2, 8, 8, 6]
# The enumerate() part is just a way to generate the counting on the left
for i, n in enumerate(my_func2(mylist, 3)):
print(f"{i:5}: {n:9}")