2017-06-16 24 views
1

我有很多列的熊貓數據幀,其中大部分是空的,但對於每一行總是有一個且只有唯一一個非空值一列值爲一個字符串。只保存非空項的值數和列數從熊貓DF每

我創建的數據幀新的列選擇唯一的非空值:

data[label] = data.iloc[:,0] 
for col in range(1,100) : 
    data[label] = data[label].fillna(data.iloc[:,col]) 

這工作得很好,不過,我也跟蹤這些列之一就是非null,對於每個條目,以便列標籤也具有該信息。我如何知道哪一列非空?

Ex. 

col0  col1  col2 
      "red" 
"blue" 
        "yellow" 

new column label is: 

label 
"red"/col1 
"blue"/col0 
"yellow"/col2 

回答

2

您可以通過idxmaxlookup的值先轉換dfTrue S其中是由notnull值,並得到列名:

cols = df.notnull().idxmax(axis=1) 
df['a'] = df.lookup(df.index, cols) + '/' + cols 
print (df) 
    col0 col1 col2   a 
0 NaN red  NaN  red/col1 
1 blue NaN  NaN blue/col0 
2 NaN NaN yellow yellow/col2 

另一種解決方案與fillnasum

cols = df.notnull().idxmax(axis=1) 
df['a'] = df.fillna('').sum(axis=1) + '/' + cols 
print (df) 
    col0 col1 col2   a 
0 NaN red  NaN  red/col1 
1 blue NaN  NaN blue/col0 
2 NaN NaN yellow yellow/col2 

另一種解決方案,謝謝Jon Clements - 使用first_valid_index

cols = df.apply(pd.Series.first_valid_index, axis=1) 
df['a'] = df.lookup(cols.index, cols) + '/' + cols 
print (df) 
    col0 col1 col2   a 
0 NaN red  NaN  red/col1 
1 blue NaN  NaN blue/col0 
2 NaN NaN yellow yellow/col2 
+1

可能會得到一個輕微加速,而不是使用在使用,'COLS = df2.apply(pd.Series.first_valid_index)'idxmax'一個丟棄非空值'然後'DF2。查找(的cols,cols.index)+ '/' +「cols.index' - 不是100%肯定,雖然 –

+1

@JonClements - 並感謝您的評論。 – jezrael