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]