Lambda Apply:引用其他行和列



我正试图根据给定单元格周围的值来更改数据集中给定列的值。考虑以下数据:

Data = {'Col1': [5593 , 5114 , 6803 , 2175 , 2175] , 'Col2': [2879 , 1176 , 7114 , 8677 , 0]}
df = pd.DataFrame(data = Data)
df.head()
Col1    Col2
0   5593    2879
1   5114    1176
2   6803    7114
3   2175    8677
4   2175    0

我创建了一个新列来存储新值:

Data['Col3'] = Data['Col2']

我想创建一个apply-lalambda函数,它执行以下操作:如果Col3为零,并且Col1的前一个值等于Col1的当前值,即:(x.shift(-2,-1(==x.shift((-2,0(,则Col3的实际值应为Col2的前一值,即x.shight(-1,-1(。否则,Col3的值应保持不变。

我尝试过类似以下的东西(伪代码(:

df['Col3'] = df['Col3'].apply(lambda x: x.shift(-1 , -1) if (x == 0 and x.shift(-2 , -1) == x.shift(-2, 0)) else x)

对于这个特定的子集,我的数据应该如下所示:

Col1    Col2    Col3
0   5593    2879    2879
1   5114    1176    1176
2   6803    7114    7114
3   2175    8677    8677
4   2175    0       8677

我不确定shift是否是正确的使用方法(该系列包含NaN(,但希望这个想法是明确的。

我的真实数据集非常大,所以我希望这些操作在许多行中都能很好地执行。

IIUC,您可以将np.where与移位的列一起使用:

df['Col3'] = np.where(df['Col1'].shift().eq(df['Col1']), df['Col2'].shift(), df['Col2'])
print(df)

输出

Col1  Col2    Col3
0  5593  2879  2879.0
1  5114  1176  1176.0
2  6803  7114  7114.0
3  2175  8677  8677.0
4  2175     0  8677.0

以下是一步一步的解释和评论:

# create a mask, where is True if the consecutive values in Col1 are equal
mask = df['Col1'].shift().eq(df['Col1'])
# choose between the shifted Col2 (the previous value) and Col2 using the mask
df['Col3'] = np.where(mask, df['Col2'].shift(), df['Col2'])
print(df)

最新更新