在第二个数据框中映射负值,保留坐标并替换第一个数据框
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
我有以下数据框:
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