簡體   English   中英

如何從熊貓的給定行中刪除僅包含零的列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM