Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从指定行中删除只包含零的列_Python_Pandas - Fatal编程技术网

Python 如何从指定行中删除只包含零的列

Python 如何从指定行中删除只包含零的列,python,pandas,Python,Pandas,我已经找到了如何使用命令df.loc[:,(df!=0).any(axis=0)]删除所有行中带零的列,我需要做同样的操作,但要给出行号 例如,对于以下df In [75]: df = pd.DataFrame([[1,1,0,0], [1,0,1,0]], columns=['a','b','c','d']) In [76]: df

我已经找到了如何使用命令
df.loc[:,(df!=0).any(axis=0)]
删除所有行中带零的列,我需要做同样的操作,但要给出行号

例如,对于以下df

In [75]: df = pd.DataFrame([[1,1,0,0], [1,0,1,0]], columns=['a','b','c','d'])

In [76]: df                                                                                                                                                                            
Out[76]: 
   a  b  c  d
0  1  1  0  0
1  1  0  1  0
为第0行提供非零的列,我希望得到以下结果:

   a  b
0  1  1
对于第1行,获取:

   a  c
1  1  1
我尝试了许多命令的组合,但找不到解决方案

更新:

我有一个300x300矩阵,我需要更好地可视化它的结果

下面是一个伪代码,试图显示我需要什么

for i in range(len(df[rows])):
  _df = df.iloc[i]
  _df = _df.filter(remove_zeros_columns)
  print('Row: ', i)
  print(_df)
结果:

Row: 0
   a  b
0  1  1

Row: 1
   a  c  f
1  1  5  10

Row: 2
   e
2  20
致以最良好的祝愿。 克莱森·里奥斯

df = pd.DataFrame([[1, 1, 0, 0], [1, 0, 1, 0]], columns=['a', 'b', 'c', 'd'])


def get(row):

    return list(df.columns[row.ne(0)])


df['non zero column'] = df.apply(lambda x: get(x), axis=1)
print(df)

如果你想要单衬里,也可以用这个

df['non zero column'] = [list(df.columns[i]) for i in df.ne(0).values]
输出

   a  b  c  d non zero column
0  1  1  0  0          [a, b]
1  1  0  1  0          [a, c]

您可以更改数据结构:

df = df.reset_index().melt('index', var_name='columns').query('value != 0')
print (df)
   index columns  value
0      0       a      1
1      1       a      1
2      0       b      1
5      1       c      1
如果需要通过
连接的值创建新列,
比较不等于的值,并使用矩阵乘法:

编辑:

或:


我认为这更严格地回答了你的问题。 只需根据需要更改给定_行的值

given_row = 1
mask_all_rows = df.apply(lambda x: x!=0, axis=0)
mask_row = mask_all_rows.loc[given_row]
cols_to_keep = mask_row.index[mask_row == True].tolist()
df_filtered = df[cols_to_keep]

# And if you only want to keep the given row
df_filtered = df_filtered[df_filtered.index == given_row]

那么最终的数据帧看起来如何?两排在一起?什么是新列名称?@jezrael我有一个非常大的密集矩阵,有很多零,我需要找到一种方法来更好地查看值。我想循环dataframe的行,并将第I行写入/附加到txt文件,其中只包含值>0的列。因此,我需要按每行对df进行切片,保留非零值的列名。若要将其拆分为一行,您可以使用:(df.iloc[I]!=0),这可能有助于迭代所有行rows@KleysonRios当您看到发布的示例的第一行和第二行时,列是a、c和a、d,那么您希望最终的df是什么样的呢?那里的列名是什么?您也可以发布示例预期输出吗?@Nihal不可能为整个df提供最终数据帧。这就是为什么我需要一个循环来选择单独的行,过滤零列并将这个df*保存到一个文件中,然后移动到下一行。对于每一行,我将有不同的列,所以不可能把所有的列放在一起。有趣的是,这个解决方案对于我的案例来说不是一个好的解决方案。我有将近300个专栏。可视化还不是很好和容易。请看,我在问题中的最后一点意见。我不需要看原始矩阵。是一个300x300的矩阵。正如您只需要查看包含非零列的选定行一样。@KleysonRios-是,那么最终输出的外观应该如何?
for i in df.index:
    row = df.loc[[i]]

    a = row.loc[:, (row != 0).any()]
    print ('Row {}'.format(i))
    print (a)
def f(x):
    print ('Row {}'.format(x.name))
    print (x[x!=0].to_frame().T)

df.apply(f, axis=1)

Row 0
   a  b
0  1  1
Row 1
   a  c
1  1  1
given_row = 1
mask_all_rows = df.apply(lambda x: x!=0, axis=0)
mask_row = mask_all_rows.loc[given_row]
cols_to_keep = mask_row.index[mask_row == True].tolist()
df_filtered = df[cols_to_keep]

# And if you only want to keep the given row
df_filtered = df_filtered[df_filtered.index == given_row]