仍然是函数及其应用程序的新功能我想为数据框创建一个新列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()。
编辑:我正在寻找解决方案的“功能版本”,因为这应该是经常使用的程序。答案 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
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