仅保存pandas df中的非空条目值和列号,每行只有一个非空值

时间:2017-06-16 13:49:12

标签: python pandas dataframe

我有一个包含许多列的pandas数据框,其中大多数都是null,但是对于每一行,总是只有一列,其值为字符串。

我在数据框中创建一个新列,用于选择唯一的非空值:

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

这样可以正常工作,但是,对于每个条目,我还会跟踪这些列中的哪一列是非空的,以便列标签也具有该信息。我如何知道哪个列非空?

Ex.

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

new column label is:

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

1 个答案:

答案 0 :(得分:2)

您可以先将df转换为True,其值为notnull,并按idxmaxlookup获取列名:

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