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