我有一个包含许多列的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
答案 0 :(得分:2)
您可以先将df
转换为True
,其值为notnull
,并按idxmax
和lookup
获取列名:
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
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