[英]find the set of column indices for non-zero values in each row in pandas' data frame
[英]pandas determine column labels that contribute to non-zero values in each row
要計算每一行中的非零值,您可以使用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.