看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本需求为利用 Pandas 取本行第一个非空值的列名(表头),即增加一列,这列表示所在行从左到右的第一个非空值对应的表头名称。
构造数据:
import pandas as pd
import numpy as np
# 造数据
df = pd.read_csv('https://gairuo.com/file/data/team.csv')
df = (
df.head(6)
.where(np.eye(6).astype(bool))
.fillna(method='bfill')
)
df
'''
name team Q1 Q2 Q3 Q4
0 Liver C 57.0 96.0 61.0 43.0
1 NaN C 57.0 96.0 61.0 43.0
2 NaN NaN 57.0 96.0 61.0 43.0
3 NaN NaN NaN 96.0 61.0 43.0
4 NaN NaN NaN NaN 61.0 43.0
5 NaN NaN NaN NaN NaN 43.0
'''
按需求描述来分析,第 0 行,第一个非空值就是第一列,那么这行的值为 name,列 3 从左到右第一个非空值为 96.0 那么取它所在的列 Q1。
需要注意的是,以上仅为示例数据,真实场景中可能第一个非空值后还会有空值,同时也可能存在整个行都为空的情况。
基本思路如下:
# 传入每个行,然后筛选掉不为空的,最后取第一个索引值
def get_col_name(s):
try:
return s.loc[s.notna()].index[0]
except:
return np.nan
df.assign(tag=df.apply(lambda s: get_col_name(s), axis=1))
'''
name team Q1 Q2 Q3 Q4 tag
0 Liver C 57.0 96.0 61.0 43.0 name
1 NaN C 57.0 96.0 61.0 43.0 team
2 NaN NaN 57.0 96.0 61.0 43.0 Q1
3 NaN NaN NaN 96.0 61.0 43.0 Q2
4 NaN NaN NaN NaN 61.0 43.0 Q3
5 NaN NaN NaN NaN NaN 43.0 Q4
'''
更新时间:Aug. 18, 2024, 3:40 p.m. 标签:pandas python 空值