Pandas方法遍历行并使用上一行的值执行计算

时间:2019-08-30 13:49:45

标签: python-3.x pandas loops numpy

我试图在Dataframe中创建两个新列,这些列是通过使用行之间的值执行的计算得出的。在将感兴趣的列转换为列表之后,我会在其感兴趣的列上使用for循环。

假设以下数据框:

import pandas as pd
import numpy as np

np.random.seed(100)
my_df=pd.DataFrame(np.random.randint(10, size=(6,4)))
my_df.columns=['A', 'x', 'B','y']
my_df.index=[10,30,40,20,60,50]

此后是否存在“ pandas”方式导致我的代码输出?

xs=np.array(my_df['x'])
diffs=[np.nan]
for i,x in enumerate(xs):
    if i>0:
        diffs.append(xs[i]-xs[i-1])
my_df['diffs']=diffs 

ys=np.array(my_df['y'])
ratios=[]
for j,y in enumerate(ys):
    if j>0 and ys[j-1]>=1.5*ys[j]:
        ratios.append(True)
    else:
        ratios.append(False)     
my_df['ratios']=ratios
print(my_df)

Output[]:
    A  x  B  y  diffs  ratios
10  8  8  3  7    NaN   False
30  7  0  4  2   -8.0    True
40  5  2  2  2    2.0   False
20  1  0  8  4   -2.0   False
60  0  9  6  2    9.0    True
50  4  1  5  3   -8.0   False

我知道iterrows,但未成功。非常感谢您的投入。

此外,如果我需要将列'x'和'y'转换为二维数组,例如:[[8,7],[0,2],[2,2],[0,4],[9,2],[1,3]],可以给我一些numpy的方向吗?

感谢advace:-)

2 个答案:

答案 0 :(得分:2)

尝试这个:

>>> import pandas as pd
>>> import numpy as np
>>>
>>> np.random.seed(100)
>>> my_df=pd.DataFrame(np.random.randint(10, size=(6,4)))
>>> my_df.columns=['A', 'x', 'B','y']
>>> my_df.index=[10,30,40,20,60,50]
>>> my_df["diffs"]=my_df["x"]-my_df["x"].shift(1)
>>> my_df
    A  x  B  y  diffs
10  8  8  3  7    NaN
30  7  0  4  2   -8.0
40  5  2  2  2    2.0
20  1  0  8  4   -2.0
60  0  9  6  2    9.0
50  4  1  5  3   -8.0
>>> my_df["ratios"]=my_df["y"].shift(1)>=1.5 * my_df["y"]
>>> my_df
    A  x  B  y  diffs  ratios
10  8  8  3  7    NaN   False
30  7  0  4  2   -8.0    True
40  5  2  2  2    2.0   False
20  1  0  8  4   -2.0   False
60  0  9  6  2    9.0    True
50  4  1  5  3   -8.0   False
>>>

并将xy导出到2列列表:

>>> import numpy as np
>>> np.array(my_df[["x", "y"]])
array([[8, 7],
       [0, 2],
       [2, 2],
       [0, 4],
       [9, 2],
       [1, 3]])

答案 1 :(得分:1)

所以我们可以做id col2(first day of every month) col4 1 1/1/2019 NULL 1 2/1/2019 red 1 3/1/2019 green 1 4/1/2019 blue 2 1/1/2019 NULL 2 2/1/2019 green 2 3/1/2019 green 2 4/1/2019 blue 3 1/1/2019 red 3 2/1/2019 red 3 3/1/2019 green 3 4/1/2019 green

zip