Python:如果元素为零,则将行和列设置为零

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,

我正在尝试使用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, 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广播创建整个数据帧掩码,并使用pandas
where
设置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
?我同时在研究解决方案,得到了类似的结果。