将/ map函数应用于前一行

时间:2016-06-10 18:58:39

标签: 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'] = 'right'
     return df['D']
 else:
      df['D'] = 'left'
      return df['D']

所以用简单的话来说:如果C中的值高于上一行中B的值,则单元格变为'右',否则为'left'。 我没有让它运行,不知何故转移不被接受或我得到错误消息

  

系列的真值是模棱两可的。使用a.empty,a.bool(),   a.item(),a.any()或a.all()。

欢迎任何有关如何最好地使用此功能的功能的帮助,并应用shift()。

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

3 个答案:

答案 0 :(得分:4)

您可以使用numpy.where

df['D'] = np.where(df.C > df.B.shift(), 'left', 'right')
print (df)
   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

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

答案 1 :(得分:3)

假设这是一个名为df

的pandas数据帧
A   B
0   0   
1   1   
2   2   
3   3   
4   4   

现在假设我将转移应用于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)]

简单吧!?快乐的编码!

答案 2 :(得分:2)

您也可以:

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