猿问

Pandas - 添加一列,其值根据当前行和上一行中的另一列值计算得出

鉴于下面的数据框,


colNames = ["Time","Col2","Col3","Col4","Col5","Col6","Col7","Col8","Col9","Col10","Col11","Col12","Col13"]

df = pd.DataFrame(colVals, columns=colNames)

df = df.set_index('Time')

df = df.apply(pd.to_numeric, errors='coerce')

需要添加新Col14的,这样它就从 0 开始,并且每当Col11当前行的值小于前一行的值时递增Col11一 - 如果前一行的Col11值是NaN,它不应该递增Col14。


例如


+-------+-------+-------------------------------------------------------------------------------------------------+

| Col11 | Col14 |                                                                                                 |

+-------+-------+-------------------------------------------------------------------------------------------------+

| 900   |     0 | start with 0                                                                                    |

| NaN   |     0 |                                                                                                 |

| 900   |     0 |                                                                                                 |

| 903   |     0 |                                                                                                 |

| 904   |     0 |                                                                                                 |

| 904   |     0 |                                                                                                 |

| 8     |     1 | increment Col14 by 1 when current row's Col11 value is less than the previous row's Col11 value |

+-------+-------+-------------------------------------------------------------------------------------------------+

有没有办法参考上一行?


繁花如伊
浏览 444回答 1
1回答

蛊毒传说

你能试试这个吗?df['col14']=df.Col11.gt(df.Col11.shift(-1)).cumsum()或者df['col14a']=df.Col11.gt(df.Col11.shift(-1)).shift().fillna(0).cumsum().astype(int)两者之间的区别在于计数在较低值的末尾(第一个)切换,它在新值的开始(第二个)切换如果您想将 NaN 视为与之前的非 Nan 值相同,请使用下面的代码。df['col14b']=df.Col11.fillna(method='ffill').gt(df.Col11.fillna(method='ffill').shift(-1)).shift().fillna(0).cumsum().astype(int)使用您提供的较小的虚拟数据集,输出如下Col11   col14   col14a  col14b0   900.0   0   0   01   NaN     0   0   02   900.0   0   0   03   900.0   0   0   04   903.0   0   0   05   904.0   0   0   06   904.0   1   0   07   8.0     1   1   18   8.0     1   1   19   200.0   1   1   110  201.0   1   1   111  NaN     1   1   112  0.0     1   1   213  1.0     1   1   214  NaN     1   1   215  NaN     1   1   216  0.0     1   1   3细节 我这里解释最后一个,其他两个与此类似。我们用df.Col11.fillna(method='ffill')以前的有效值填充 NaN,所以输出如下(我们没有更改 Coll11,我们只是在创建新列时使用它)0     900.01     900.02     900.03     900.04     903.05     904.06     904.07       8.08       8.09     200.010    201.011    201.012      0.013      1.014      1.015      1.016      0.0我们只是向上移动 1 行,df.Col11.fillna(method='ffill').shift(-1)以便我们可以在行和它的前一行之间进行比较。0     900.01     900.02     900.03     903.04     904.05     904.06       8.07       8.08     200.09     201.010    201.011      0.012      1.013      1.014      1.015      0.016      NaN用df.Col11.fillna(method='ffill').gt(df.Col11.fillna(method='ffill').shift(-1)),我们进行比较,结果为真假,如下所示。0     False1     False2     False3     False4     False5     False6      True7     False8     False9     False10    False11     True12    False13    False14    False15     True16    False我们使用shift将值向下移动一行,因为您希望在存在较小数字时切换数字。当我们向下移动行时,第一行变成NaN,我们用 0 替换它(因为我们必须从零开始)使用.fillna(0)。然后我们使用.cumsum(). .cumsum()只添加True值,所以我们得到我们需要的值。最后,我们将此列分配为整数,.astype(int)以使所有值都为整数。
随时随地看视频慕课网APP

相关分类

Python
我要回答