2017-06-16 26 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