在第二个数据框中映射负值,保留坐标并替换第一个数据框

Mapping negative values in a second dataframe, keep the coordinates and replace first dataframe

我有以下数据框:

df = pd.DataFrame([[1, 5, 1], [2, 6, 2], [3, 7, 3], [4, 8, 4]])
df2 = pd.DataFrame([[1, 5, 10], [3, 6, 2], [1, 9, 3], [4, 8, 4]])

我需要检查它们的减法 (df - df2):

df_sub = pd.DataFrame([[0, 0, -9], [-1, 0, 0], [2, -2, 0], [0, 0, 0]])

当有负值时,我需要保留它们的坐标并替换第一个数据框中的 0:

df = pd.DataFrame([[1, 5, 0], [0, 6, 2], [3, 0, 3], [4, 8, 4]])

我想到了这样一个函数:

def find_negative(df):
  coordinates = []
  for column in df.columns:
    for index in df.index:
      if df.loc[index, column] < 0:
        coordinates.append((index, column))
  return coordinates

但是如何将它应用到第一个数据帧?

对于数据帧:

# mask
mask = df < df2

# update df
df[mask] = 0

# coordinate:
row_idx, col_idx = np.where(mask)
rows = df.index[row_idx]
cols = df.columns[col_idx]

您可以从 df 中减去 df2 并使用 df.where:

new_df = df.where(df - df2 >= 0, 0)

输出:

>>> new_df 
   0  1  2
0  1  5  0
1  0  6  2
2  3  0  3
3  4  8  4

>>> new_df.to_numpy().tolist()
[[1, 5, 0], [0, 6, 2], [3, 0, 3], [4, 8, 4]] 
df = np.array([[1, 5, 1], [2, 6, 2], [3, 7, 3], [4, 8, 4]])
df2 = np.array([[1, 5, 10], [3, 6, 2], [1, 9, 3], [4, 8, 4]])

df = np.where(df-df2 < 0, 0, df)
df # array([[1, 5, 0],[0, 6, 2],[3, 0, 3],[4, 8, 4]],dtype=int64)

也适用于 pd.DataFrame

可以使用fillna

df[df_sub >= 0].fillna(0)

   0  1  2
0  1  5  0
1  0  6  2
2  3  0  3
3  4  8  4

替代使用mask

>>> df.mask(df < df2, other=0)
   0  1  2
0  1  5  0
1  0  6  2
2  3  0  3
3  4  8  4