迭代Pandas中的行并在两列相等时应用函数

时间:2018-04-09 16:26:43

标签: python pandas dataframe lambda

我有一个如下所示的数据框:

import pandas as pd
inp = [{'ID':"a", 'start':100, 'end': 200}, {'ID':"b", 'start':250, 'end': 300},
 {'ID':"c", 'start':300, 'end': 300}, {'ID':"d", 'start':350, 'end': 500},
 {'ID':"e", 'start':600, 'end': 600}, {'ID':"f", 'start':700, 'end': 900}]
df = pd.DataFrame(inp)
df[['ID','start','end']]



ID  start   end
0   a   100 200
1   b   250 290
2   c   300 300
3   d   350 500
4   e   600 600
5   f   700 900

我想迭代我的df行并应用一个函数,其中起点和终点列相等(即行2和4),这样我就可以有一个变异的df,如下所示:

ID  start   end
0   a   100 200
1   b   250 390
2   c   391 300
3   d   350 500
4   e   501 600
5   f   700 900

在mutated df中,start和end值相等,我用前一列+ 1的结束值替换了起始值。

我试图迭代这样的行:

for index, row in df.iterrows():
  if(df['start'][i]==df['end'][i]):
      df[start'][i]=(df['end'][i-1]+1) # Here I am trying to refer to the end value in the previous row!
  else:
      df['start'][i]==df[start'][i] # Don't mess with the values if start and end are different!

对于如何解决这个问题的任何暗示/建议,我将不胜感激!

1 个答案:

答案 0 :(得分:3)

您不应为可矢量化计算迭代行。

这是通过pd.DataFrame.loc实现逻辑的一种方式:

df.loc[df['start'] == df['end'], 'start'] = df['end'].shift(1) + 1

#   ID  end  start
# 0  a  200  100.0
# 1  b  300  250.0
# 2  c  300  301.0
# 3  d  500  350.0
# 4  e  600  501.0
# 5  f  900  700.0