簡體   English   中英

pandas 確定對每一行中的非零值有貢獻的列標簽

[英]pandas determine column labels that contribute to non-zero values in each row

對於下面顯示的數據框,我想執行以下操作:

  1. 在每一行中,我想確定非零值的數量,我已經能夠使用 np.where 做到這一點。
  2. 然后我想確定每行中對這些非零值有貢獻的列標簽。 任何幫助將不勝感激。 提前致謝在此處輸入圖片說明

要計算每一行中的非零值,您可以使用numpy包中的nonzero_count行執行操作:

import numpy as np
df['non_zero_count'] = np.count_nonzero(df,axis=1)

>>> df

      1     2     3     4     5     6      7  non_zero_count
0  8122     0     0     0     0     0      0               1
1     0     0     0  3292     0  1313      0               2
2     0  8675     0     0     0     0      0               1
3     0     0  1910     0   213     0  12312               3
4     0     0     0     0  4010     0      0               1
5     0     0     0     0     0  1002      0               1
6     0     0     0     0     0     0   1278               1

然后,您可以使用apply獲取行包含非零值的列,因此如果您手頭有大數據集,請在此處小心:

df['non_zero_label'] = df.drop('non_zero_count',axis=1)\
    .apply(lambda r: r.index[r.ne(0)].to_list(), axis=1)
df


>>> df

      1     2     3     4     5     6      7  non_zero_count non_zero_label
0  8122     0     0     0     0     0      0               1            [1]
1     0     0     0  3292     0  1313      0               2         [4, 6]
2     0  8675     0     0     0     0      0               1            [2]
3     0     0  1910     0   213     0  12312               3      [3, 5, 7]
4     0     0     0     0  4010     0      0               1            [5]
5     0     0     0     0     0  1002      0               1            [6]
6     0     0     0     0     0     0   1278               1            [7]

考慮到數據幀名稱是df

df[df != 0].stack().reset_index(level=0, drop=True)

這將返回一個以列標簽為索引和非零值的系列,對於您的示例,輸出為:

1    8122.0
4    3292.0
2    8675.0
3    1910.0
5    4010.0
6    1002.0
7    1278.0

你可以這樣做:

df = pd.DataFrame({'x' : [ 0,0,9],'y' : [-1,3,0],'z' : [0,1.1,3]},index=['a','b','c'])
df["non_zero_columns"] = df.where(df == 0, 
                                  other=df.apply(lambda x: x.name), 
                                  axis=1).where(df != 0, 
                                                other="").apply(lambda row: ''.join(row.values), axis=1)

這使:

x  y    z non_zero_columns  non zero
a  0 -1  0.0                y         1
b  0  3  1.1               yz         2
c  9  0  3.0               xz         2

將其應用於您的數據框。

相同數據幀的另一種解決方案是:

cols = df.columns
df = df.apply(lambda x: x != 0)
df['Non_zero_columns'] = df.apply(lambda x: list(cols[x.values]), axis=1)
df['Length'] = df['Non_zero_columns'].str.len()

它產生:

  x      y      z Non_zero_columns  Length
a  False   True  False              [y]       1
b  False   True   True           [y, z]       2
c   True  False   True           [x, z]       2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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