gpt4 book ai didi

python - 进行 Pandas 操作和跳过行的有效方法

转载 作者:太空宇宙 更新时间:2023-11-04 05:39:38 25 4
gpt4 key购买 nike

一定有一种简单的方法可以做到这一点,但我错过了。首先,想象一下Excel中的情况:

  1. 我有一列百分比变化。 (假设 A 列)
  2. 在下一列 (B) 中,我想根据百分比变化创建一个从 1000 开始的索引系列。在 Excel 中,我这样做。-将 B1 设置为 1000- 将 B2 设置为公式 =(1+A2)*B1- 向下复制该列。简单。

现在,我想对 pandas 做同样的事情,问题是以下代码导致目标数组变为 NaN:

import pandas as pd
import numpy as np

df_source = pd.DataFrame(np.random.normal(0,.05,10), index=range(10), columns=['A'])

df_target = pd.DataFrame(index = df_source.index)
df_target.loc[0,"A"] = 1000 # initialize target array to start at 1000

df_target["A"] = (1 + df_source) * df_target["A"].shift(1) # How to skip first row?

目标数组变为 NaN,因为第一行试图引用“脱离数据帧”的值,因此整列返回 NaN。

我意识到我可以用循环遍历行,跳过第一行,但这非常慢,而且对于我将要进行的数据集或迭代的大小来说不切实际。

必须有一种方法可以使用 pandas/numpy 数组函数,但告诉它跳过计算中的第一行。怎么做?我已经尝试过 bool 索引但无法让它工作,也许有一种方法可以告诉 Pandas 跳过 NaN 结果......但最好的方法似乎是一个限定符,它说“应用此代码,从第二排。”

我在这里错过了什么?

编辑:

看来我的问题比我意识到的要深。 jezrael 下面的回答解决了 NA 问题,但我想我对 pandas 逻辑感到困惑。我上面给出的代码不起作用,因为它在元素方面不起作用。例如,简单的例子:

seriesdf = pd.DataFrame(index = range(10))
seriesdf['A'] = 1
seriesdf['A'].ix[1:] = 1 + seriesdf['A'].shift(1)

给出结果

   A
0 1
1 2
2 2
3 2
4 2
5 2
6 2
7 2
8 2
9 2

不是我假设的升序计数。所以问题是在 pandas 数据帧上逐行计算的最有效方法是什么?速度在此应用程序中很重要,因此我宁愿不通过行进行交互。

这里是新来的 python 程序员,所以想弄清楚这个问题。非常感谢向我展示如何自己学习/弄清楚这样的东西的答案。谢谢!

最佳答案

IIUC 你可以跳过 df_sourceA 列的第一行,方法是选择所有行而不先通过 ix :

df_target["A"].ix[1:] = df_source['A'].ix[1:] + 1
print df_target
A
0 1000.000000
1 0.988898
2 0.986142
3 1.009979
4 1.005165
5 1.101116
6 0.992312
7 0.962890
8 1.051340
9 1.009750

或者你可能认为:

import pandas as pd
import numpy as np

df_source = pd.DataFrame(np.random.normal(0,.05,10), index=range(10), columns=['A'])
print df_source
A
0 0.039965
1 0.060821
2 -0.079238
3 -0.129932
4 0.002196
5 -0.003721
6 -0.008358
7 0.014104
8 -0.022905
9 0.014793

df_target = pd.DataFrame(index = df_source.index)
#all A set to 1000
df_target["A"] = 1000 # initialize target array to start at 1000
print df_target
A
0 1000
1 1000
2 1000
3 1000
4 1000
5 1000
6 1000
7 1000
8 1000
9 1000
df_target["A"] = (1 + df_source["A"].shift(-1))* df_target["A"]
print df_target
A
0 1060.820882
1 920.761946
2 870.067878
3 1002.195555
4 996.279287
5 991.641909
6 1014.104402
7 977.094961
8 1014.793488
9 NaN

编辑:

也许你需要cumsum :

df_target["B"]  = 2
df_target["C"] = df_target["B"].cumsum()

df_target["D"] = df_target["B"] + df_target.index
print df_target
A B C D
0 1041.003000 2 2 2
1 1013.817000 2 4 3
2 948.853000 2 6 4
3 1031.692000 2 8 5
4 970.875000 2 10 6
5 1011.095000 2 12 7
6 1053.472000 2 14 8
7 903.765000 2 16 9
8 1010.546000 2 18 10
9 0.010546 2 20 11

关于python - 进行 Pandas 操作和跳过行的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34389922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com