我正在尝试研究如何显示熊猫系列中的 条纹True或 条纹。False
数据:
p = pd.Series([True,False,True,True,True,True,False,False,True])
0 True
1 False
2 True
3 True
4 True
5 True
6 False
7 False
8 True
dtype: bool
Run Code Online (Sandbox Code Playgroud)
我尝试过p.diff(),但不确定如何计算False生成的值以显示我想要的输出,如下所示:
0 0
1 0
2 0
3 1
4 2
5 3
6 0
7 1
8 0
Run Code Online (Sandbox Code Playgroud) ve <- c(17, -9, 9, -17, 17, -17, 11, -9, 16, -18, 17, 0, 0, -18, 17, 0, 0, -17, 14, -14, 17, -2, 0, -15, 9, -9, 17, -16, 16, -17, 17, -17, 17, -17, 17, -17, 17, -8, 7, -16, 17, -14, 14, -10, 10, -16, 16, -10, 10, -12, 12, -11, 11, -17, 17, -17, 17, -9, 8, -17, 17, -17, 17, -16, 16, -17, 17, -8, 8, -9, 9, -17, 17, -17, 17, -13, 13, -10, …Run Code Online (Sandbox Code Playgroud) 对于某些 Pandas 函数,例如 sum()、cumsum() 和 cumprod(),有一个 Skipna 选项,默认设置为 True。这给我带来了问题,因为错误可能会悄悄地传播,所以我总是明确地将skipna设置为False。
sum_df = df.sum(skipna=False)
Run Code Online (Sandbox Code Playgroud)
每次出现这些函数之一时都执行此操作会使代码看起来有点笨拙。有没有办法改变 Pandas 的默认行为?
假设我有这个数据帧(“数字”变量也来自原始数据帧中的字符类型):
df <- data.frame(
id = c(1,2,2,1,2),
number = c(30.6, "50.2/15.5", "45/58.4", 80, "57/6"))
df$number <- as.character(df$number)
Run Code Online (Sandbox Code Playgroud)
现在我想添加另一列,其中包含每个 ID 的累积总和,我使用 执行此操作df %>% mutate(csum = ave(number, id, FUN=cumsum)),它适用于单个数字,但当然不适用于用“/”分隔的数字。我怎么解决这个问题?
最终的数据框应该是这样的:
df2 <- data.frame(
id = c(1,2,2,1,2),
number = c(30.6, "50.2/15.5", "45/58.4", 80, "57/6"),
csum = c(30.6, "50.2/15.5", "95.2/73.9", 110.6, "152.2/79.9"))
df2
Run Code Online (Sandbox Code Playgroud) 我在更大的数据集中有这些列(这里我只报告资产“x”,但有不同的资产,因此想法是为每个资产复制该过程):
df <- structure(list(
asset = c("x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x")
col1 = c(10, 10, -22, 11, -13, 15, -7, -10, 10, -5, 3),
cumsum(col1) = c(10, 20, -2, 9, -4, 11, 4, -6, 4, -1, 2),
class = "data.frame", row.names = c(NA, -11L)
)
Run Code Online (Sandbox Code Playgroud)
我想纠正 col1 中的负数,使 cumsum(col1) 等于
cumsum(col1) = c(10, 20, 0, 11, 0, 15, 8, 0, 10, 5, 8)
Run Code Online (Sandbox Code Playgroud)
为了得到这个结果,我需要纠正 col1 数字当且仅当负数大于前一个数字的总和。例如,-22第三个位置的 应该变为-20与前一个的 cumsum 相匹配10+10 …
我想要一个与cumsum等效的函数,但不是加起来它计算到目前为止唯一值的数量.我可以为每个潜在的集合编写一个循环,但由于我的数据集有数百万的观察结果,这似乎会耗费时间.
例:
a <- c(1,3,2,4,1,5,2,3)
f(a)
[1] 1 2 3 4 4 5 5 5
Run Code Online (Sandbox Code Playgroud) 我想重置cumsum一个向量,因为它达到了一定的值.
例如,对于以下向量:
v <- c(3, 5, 2, 5, 3, 4, 5, 3, 1, 4)
Run Code Online (Sandbox Code Playgroud)
预期产量是:
c(0, 0, 10, 0, 0, 22, 0, 30, 0, 0)
Run Code Online (Sandbox Code Playgroud)
随着reset <- 10我的任务减少到完整整后标记的第一值:
res <- cumsum(v)
resd <- res/reset
resd
# [1] 0.3 0.8 1.0 1.5 1.8 2.2 2.7 3.0 3.1 3.5
Run Code Online (Sandbox Code Playgroud)
预期产量是这样的:
c(F, F, T, F, F, T, F, T, F, F) # or
c(0, 0, 1.0, 0, 0, 2.2, 0, 3.0, 0, 0)
Run Code Online (Sandbox Code Playgroud)
我需要一种快速的方法来计算其中一种.
我有一个data.table dt如下。
df <- data.frame(t1 = rep(0,5), t3 = c(12, 5, 8,9, 5), t7= c(25, 48, 7, 9, 14))
dt <- setDT(df)
dt
t1 t3 t7
1: 0 12 25
2: 0 5 48
3: 0 8 7
4: 0 9 9
5: 0 5 14
Run Code Online (Sandbox Code Playgroud)
我想获得各列的累计总和。我只是把它跨行。如何做到这一点data.table。
dt[, 1:3 := cumsum(dt)]
dt
t1 t3 t7
1: 0 12 25
2: 0 17 73
3: 0 25 80
4: 0 34 89
5: 0 39 103
Run Code Online (Sandbox Code Playgroud)
所需的输出如下: …
我正在尝试计算cumsum从每一组的最后一行到第一行的起点.
样本数据:
t1 <- data.frame(var = "a", val = c(0,0,0,0,1,0,0,0,0,1,0,0,0,0,0))
t2 <- data.frame(var = "b", val = c(0,0,0,0,1,0,0,1,0,0,0,0,0,0,0))
ts <- rbind(t1, t2)
Run Code Online (Sandbox Code Playgroud)
所需格式(按分组var):
ts <- data.frame(var = c("a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b"),
val = c(2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,2,2,2,2,2,1,1,1,0,0,0,0,0,0,0))
Run Code Online (Sandbox Code Playgroud) 我有一个数字序列,例如[0,0,0,0,1,1,1,0,0,1,1,0]。我想根据最近的非零值来计算数字总和。即,一旦出现零输入,则总和将重置为零。
input: [0,0,0,0,1,1,1,0,0,1,1,0]
output:[0,0,0,0,1,2,3,0,0,1,2,0]
Run Code Online (Sandbox Code Playgroud)
是否有内置的python函数能够实现这一目标?还是更好的无循环计算方式?