Python 将/map函数应用于前一行

Python 将/map函数应用于前一行,python,dictionary,pandas,dataframe,Python,Dictionary,Pandas,Dataframe,对于函数及其应用程序仍然是新手,我想为数据帧创建一个新列D: df = pd.DataFrame([[1, 2, 3], [1, 3, 5], [4, 6, 7]], columns=['A', 'B', 'C']) A B C 0 1 2 3 1 1 3 5 2 4 6 7 列D及其内容应通过函数创建,我认为这种方式: def my_func(B, C): if C > B.shift(1): df[

对于函数及其应用程序仍然是新手,我想为数据帧创建一个新列
D

 df = pd.DataFrame([[1, 2, 3], [1, 3, 5], [4, 6, 7]], columns=['A', 'B', 'C'])

    A   B   C
 0  1   2   3
 1  1   3   5
 2  4   6   7
D
及其内容应通过函数创建,我认为这种方式:

 def my_func(B, C):
     if C > B.shift(1):
         df['D'] = 'right'
     return df['D']
 else:
      df['D'] = 'left'
      return df['D']
因此,简单地说:如果
C
中的值高于上一行
B
的值,则单元格将变为“右”,否则变为“左”。 我没有让它运行,不知为什么轮班不被接受,或者我收到了错误消息

级数的真值是模糊的。使用a.empty,a.bool(), a、 item()、a.any()或a.all()

欢迎提供有关如何最好地将函数用于此类任务的任何帮助,并应用shift()

编辑:我正在寻找解决方案的“功能版本”,因为这是一个经常使用的程序

您还可以:

df.loc[df.C > df.B.shift(), 'D'] = 'left'
df.D = df.D.fillna('right')

   A  B  C      D
0  1  2  3  right
1  1  3  5   left
2  4  6  7   left

假设这是一个名为
df

A   B
0   0   
1   1   
2   2   
3   3   
4   4   
现在让我们假设我将shift应用于
B

将会发生的是

A   B
0   NaN   
1   0 
2   1   
3   2   
4   3
因此,当您尝试比较时,它会弹出一个错误,因为它正在尝试将数字与非数字(NaN)进行比较

所以现在这取决于你想对第一行做什么

现在谈谈为什么这个特殊的片段不起作用。 您试图做的是发送一个系列作为参数,并将它们进行比较以更新一行。。。。
C>B.shift(1)
注意C和B是串联的,这就是错误弹出的原因。因此,为了避免这种情况,您必须检查每行的条件并更新
D

这可以通过

df['D'] = ['right' if i > j else 'left' for i, j in zip(df.B.shift(), df.C)]
简单,对吧!?快乐编码

您可以使用:

如果需要功能:

def f(B, C):
    df['D'] = np.where(C > B.shift(), 'left', 'right')
    return df

print(f(df.B, df.C))
   A  B  C      D
0  1  2  3  right
1  1  3  5   left
2  4  6  7   left
或:


“我喜欢这个解决方案@jezrael,但我怎样才能在函数中实现它呢?你解释为什么我没有走多远,这让事情变得很清楚,@hashcode55。”。谢谢你。我只需要更好地掌握zip函数的实现。我永远不会发现我自己。。。。
def f(B, C):
    df['D'] = np.where(C > B.shift(), 'left', 'right')
    return df

print(f(df.B, df.C))
   A  B  C      D
0  1  2  3  right
1  1  3  5   left
2  4  6  7   left
def f(B, C):
    df['D'] = np.where(C > B.shift(), 'left', 'right')
    return df.D

print(f(df.B, df.C))
0    right
1     left
2     left
Name: D, dtype: object