我有一个 numpy 数组a,a.shape=(17,90,144). 我想找到 的每列的最大值cumsum(a, axis=0),但保留原始符号。换句话说,如果对于给定列,a[:,j,i]的最大值cumsum对应于负值,我想保留减号。
该代码np.amax(np.abs(a.cumsum(axis=0)))获取了大小,但不保留符号。相反,使用它np.argmax可以获得我需要的索引,然后我可以将其插入到原始cumsum数组中。但我找不到一个好的方法来做到这一点。
下面的代码可以工作,但是很脏而且很慢:
max_mag_signed = np.zeros((90,144))
indices = np.argmax(np.abs(a.cumsum(axis=0)), axis=0)
for j in range(90):
for i in range(144):
max_mag_signed[j,i] = a.cumsum(axis=0)[indices[j,i],j,i]
Run Code Online (Sandbox Code Playgroud)
必须有一种更干净、更快的方法来做到这一点。有任何想法吗?
有没有更优雅的方法来实现这一目标?我目前基于各种stackoverflow答案的解决方案如下
df = pds.DataFrame([[11,12,13,14],[15,16,17,18]], columns = [0,1,2,3])
print df
dT = df.T
dT.reindex(dT.index[::-1]).cumsum().reindex(dT.index).T
Run Code Online (Sandbox Code Playgroud)
输出
df is:
0 1 2 3
0 11 12 13 14
1 15 16 17 18
after by row reverse cumsum
0 1 2 3
0 50 39 27 14
1 66 51 35 18
Run Code Online (Sandbox Code Playgroud)
我必须经常对我的数据执行此操作(大小也更大),并尝试找出一种更短/更好的方法来实现这一目标。
谢谢
因此,给出以下单列数据框:
from pandas import DataFrame
df = DataFrame({0: {'10/10/2012': 50, '10/11/2012': -10, '10/12/2012': 100})
In [3]: df
Out[3]:
0
10/10/2012 50
10/11/2012 -10
10/12/2012 100
Run Code Online (Sandbox Code Playgroud)
我想为给定列创建累积和,但给累加器一个初始值。因此,对于上面的数据帧,初始值为 100,这将如下所示:
0 1
10/10/2012 50 150
10/11/2012 -10 140
10/12/2012 100 240
Run Code Online (Sandbox Code Playgroud)
任何帮助,非常感谢。
我想创建以下数据帧:
Index A B C
a 0 0 0
b 1 10 0
c -1 0 -10
d 1 20 0
e 0 0 0
f -1 0 -20
g 0 0 0
h 1 15 0
i -1 0 -15
Run Code Online (Sandbox Code Playgroud)
A并B给出.C应通过函数生成,无需迭代.可能就是这种方式:
def generate_C():
C = np.where(A == -1, << here prior value from B * -1 >>, 0)
df['C] = C
return df
Run Code Online (Sandbox Code Playgroud)
我尝试通过cumsum()在列上B,C但没有走远.有什么建议吗?
我有一个数据框df(可以在此处下载)引用公司登记册,如下所示:
Provider.ID Local.Authority month year entry exit total
1 1-102642676 Warwickshire 10 2010 2 0 2
2 1-102642676 Bury 10 2010 1 0 1
3 1-102642676 Kent 10 2010 1 0 1
4 1-102642676 Essex 10 2010 1 0 1
5 1-102642676 Lambeth 10 2010 2 0 2
6 1-102642676 East Sussex 10 2010 5 0 5
7 1-102642676 Bristol, City of 10 2010 1 0 1
8 1-102642676 Liverpool 10 2010 1 0 1
9 …Run Code Online (Sandbox Code Playgroud) 我在 Pandas 中有一个包含布尔值的列,并且想要计算自最后一个 True 值以来的 thr 行,如下所示:
a b
False 0
True 0
False 1
False 2
False 3
True 0
False 1
True 0
Run Code Online (Sandbox Code Playgroud)
我可以通过循环来完成,但似乎必须有更好的方法
在下面的数据框中,我想创建一个新列C,该列将是该列中每个组的累积总和,但这些总和必须从零开始,并且仅添加值,直到该组的倒数第二个条目。BA
A B
0 1 5
1 1 6
2 2 3
3 2 4
4 2 5
5 3 2
5 3 7
6 4 3
Run Code Online (Sandbox Code Playgroud)
所以,我的结果应该是:
A B C
0 1 5 0
1 1 6 5
2 2 3 0
3 2 4 3
4 2 5 7
5 3 2 0
5 3 7 2
6 4 3 0
Run Code Online (Sandbox Code Playgroud)
(我认为这个问题非常明显,但不知怎的,我自己无法弄清楚,也无法在任何地方看到它。)
我有一个包含多列的数据框.对于一列,我想计算累积总和,但我有一些缺少值的问题.
#sample data
test <- c(-1.2, 4.6, -8.3, 5, 8, 1, -2, NA, NA, NA, -3, 5.1, 1.9)
test <- as.data.frame(test)
#This gives NA after NAs occurred
sum_test <- lapply(test, FUN=cumsum)
sum_test
$test
[1] -1.2 3.4 -4.9 0.1 8.1 9.1 7.1 NA NA NA NA NA NA
#This continues with adding to pre-NA value after last NA
sum_test <- lapply(test, function(x) ave(x, is.na(x), FUN=cumsum))
sum_test
$test
[1] -1.2 3.4 -4.9 0.1 8.1 9.1 7.1 NA NA NA 4.1 9.2 11.1 …Run Code Online (Sandbox Code Playgroud) 我有一个df,在最左边的列中有一些代码,在其他列中有一个前向轮廓(下面的df1)
DF1:
code tp1 tp2 tp3 tp4 tp5 tp6 \
0 1111 0.000000 0.000000 0.018714 0.127218 0.070055 0.084065
1 222 0.000000 0.000000 0.000418 0.000000 0.017540 0.003015
2 333 1.146815 1.305678 0.384918 0.688284 0.000000 0.000000
3 444 0.000000 0.000000 1.838797 0.000000 0.000000 0.000000
4 555 27.190002 27.134837 24.137560 17.739465 11.990806 8.631395
5 666 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
tp7 tp8 tp9 tp10
0 0.019707 0.000000 0.000000 0.000000
1 6.594860 10.535905 15.697232 21.035824
2 0.000000 0.000000 0.000000 0.000000
3 0.000000 0.000000 …Run Code Online (Sandbox Code Playgroud) 我有一个数据框,其中包含以下列:
|---------------------|
| A |
|---------------------|
| 0 |
|---------------------|
| 2.63 |
|---------------------|
| 7.10 |
|---------------------|
| 5.70 |
|---------------------|
| 6.96 |
|---------------------|
| 7.58 |
|---------------------|
| 3.3 |
|---------------------|
| 1.93 |
|---------------------|
Run Code Online (Sandbox Code Playgroud)
我需要得到累积总和,但这一点有点特别.第一个元素应该是0,以下是从前一列开始的累积和,所以在这种情况下我需要生成:
|---------------------|
| B |
|---------------------|
| 0 |
|---------------------|
| 0 |
|---------------------|
| 2.63 |
|---------------------|
| 9.73 |
|---------------------|
| 15.43 |
|---------------------|
| 22.39 |
|---------------------|
| 29.97 |
|---------------------|
| 33.27 |
|---------------------|
Run Code Online (Sandbox Code Playgroud)
我知道当没有我要求的条件时很容易实现:
df['B'] = df.A.cumsum() …Run Code Online (Sandbox Code Playgroud)