Python:如果元素为零,则将行和列设置为零
我正在尝试使用Pandas解决以下python面试问题: 给定一个m x n矩阵,如果元素为0,则将其整行和整列设置为0。在适当的地方做 以下是一些例子:Python:如果元素为零,则将行和列设置为零,python,pandas,Python,Pandas,我正在尝试使用Pandas解决以下python面试问题: 给定一个m x n矩阵,如果元素为0,则将其整行和整列设置为0。在适当的地方做 以下是一些例子: # Example 1 [[1, 1, 1], [1, 0, 1], [1, 1, 1]] # input [[1, 0, 1], [0, 0, 0], [1, 0, 1]] # output # Example 2 [[0, 1, 2, 0], [3, 4, 5, 2], [1, 3, 1, 5]] # input [[0, 0,
# Example 1
[[1, 1, 1], [1, 0, 1], [1, 1, 1]] # input
[[1, 0, 1], [0, 0, 0], [1, 0, 1]] # output
# Example 2
[[0, 1, 2, 0], [3, 4, 5, 2], [1, 3, 1, 5]] # input
[[0, 0, 0, 0], [0, 4, 5, 0], [0, 3, 1, 0]] # output
以下是我提出的解决方案:
def solution(mat):
"""Brute force - O(n**2)"""
cols = []
for i, row in enumerate(mat):
for j, item in enumerate(row):
if item == 0:
mat[i] = [0] * len(row)
cols.append(j)
for i, _ in enumerate(mat):
for j in cols:
mat[i][j] = 0
使用熊猫有更好的方法吗?使用.eq
、.any
和.loc
我们可以使用.eq
检查数据帧是否等于0。
然后,我们在轴=1
和轴=0
上检查.any
,以选择包含any0的行和列
最后,我们使用.loc
将这些行/列设置为0
# Example dataframe
a b c
0 1 1 1
1 1 0 1
2 1 1 1
输出
a b c
0 1 0 1
1 0 0 0
2 1 0 1
a b c d
0 0 0 0 0
1 0 4 5 0
2 0 3 1 0
第二个示例的测试2:
# Example dataframe #2
a b c d
0 0 1 2 0
1 3 4 5 2
2 1 3 1 5
m1 = df.eq(0).any(axis=1)
m2 = df.eq(0).any(axis=0)
df.loc[m1] = 0
df.loc[:, m2] = 0
输出
a b c
0 1 0 1
1 0 0 0
2 1 0 1
a b c d
0 0 0 0 0
1 0 4 5 0
2 0 3 1 0
这不是一步一个脚印,而是我得到的。它比使用
进行-循环更短更干净
您可以获得任意零的行和列
rows = (df == 0).any(1)
cols = (df == 0).any(0)
然后可以在行和列中设置零
df.loc[rows,:] = 0
df.loc[:,cols] = 0
完整代码:
import pandas as pd
df = pd.DataFrame([[1, 1, 1], [1, 0, 1], [1, 1, 1]])
#df = pd.DataFrame([[0, 1, 2, 0], [3, 4, 5, 2], [1, 3, 1, 5]])
rows = (df == 0).any(1)
cols = (df == 0).any(0)
df.loc[rows,:] = 0
df.loc[:,cols] = 0
print(df)
此解决方案使用numpy广播创建整个数据帧掩码,并使用pandaswhere
设置0
m = df.ne(0).all(0).values[None,:] * df.ne(0).all(1).values[:,None]
Out[834]:
array([[ True, False, True],
[False, False, False],
[ True, False, True]])
df.where(m, 0)
Out[835]:
0 1 2
0 1 0 1
1 0 0 0
2 1 0 1
因为您处理的是矩阵,所以我将使用numpy
而不是pandas
。关于pandas
,您已经有了很好的答案,因此我建议使用numpy
import numpy as np
ia = [[1, 1, 1], [1, 0, 1], [1, 1, 1]]
ib = [[0, 1, 2, 0], [3, 4, 5, 2], [1, 3, 1, 5]]
a = np.array(ia)
b = np.array(ib)
def funczero(x):
idxs = np.argwhere(x == 0) #find indexes where the matrix element is 0
for i in idxs:
x[i[0],:] = 0 #setting all row elements to 0
x[:,i[1]] = 0 #setting all column elements to 0
funczero
可以正常工作,因此您可以调用例如funczero(a)
并修改a
。您不使用pandas@run-我说我没看到熊猫。如果有人对熊猫有问题,那么它应该尝试在熊猫身上做点什么——至少他创建了数据帧。旁边是评论的地方,我不必给出其他的解决方案。答案如下。@runout,这对您意味着什么?对我来说,这意味着“你不使用熊猫,我在你的问题中看不到熊猫。”pandas
确实可以在这里使用,但因为你处理的是矩阵,我会选择numpy
。检查你的变量'm'df.loc[m]=0这几乎是我答案的一个副本,但是你只是==
而不是.eq
?我同时在研究解决方案,得到了类似的结果。