【问题标题】:Pandas method to iterate over rows and perform calculations using values of previous rowPandas 方法迭代行并使用前一行的值执行计算
【发布时间】:2020-01-03 18:48:25
【问题描述】:

我正在尝试在 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]

以后有没有一种“熊猫”方式导致我的代码输出?

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 的方向吗?

提前感谢 :-)

【问题讨论】:

    标签: python-3.x pandas loops numpy


    【解决方案1】:

    所以我们可以做zip

    np.array(list(zip(df.x,df.y)))
    Out[810]: 
    array([[8, 7],
           [0, 2],
           [2, 2],
           [0, 4],
           [9, 2],
           [1, 3]])
    

    【讨论】:

    • 谢谢,这真的很优雅和简短:-)
    【解决方案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]])
    

    【讨论】:

    • 我没有遇到shift,这很有帮助。我会试试的。
    猜你喜欢
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2016-01-10
    相关资源
    最近更新 更多