[英]How do I delete a column that contains only zeros from a given row in pandas
我已經找到了如何使用命令df.loc[:, (df != 0).any(axis=0)]
刪除所有行的零列,我需要做同樣的事情,但是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
最好的祝福。 克萊森·里奧斯(Kleyson Rios)。
您可以更改數據結構:
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
如果值需要新列加入了,
通過比較不相等的值DataFrame.ne
和使用矩陣乘法DataFrame.dot
:
df['new'] = df.ne(0).dot(df.columns + ', ').str.rstrip(', ')
print (df)
a b c d new
0 1 1 0 0 a, b
1 1 0 1 0 a, c
編輯:
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
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]
我認為這可以更嚴格地回答您的問題。 只需根據需要更改Given_row的值即可。
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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.