如何获取Pandas DataFrame每行的第二个非空列名称?
获取每行的第二个非空列名称
好问题!既然你已经掌握了获取每行第一个非空列名的方法,要拿到第二个其实可以换个思路——先提取每行所有非空值对应的列名,再从中选取第二个元素。
实现代码
import pandas as pd # 你的原始DataFrame df = pd.DataFrame({ 'A': [1.0, None, 7.0], 'B': [None, 1.0, 1.0], 'C': [2.0, 4.0, 2.0] }) # 第一步:提取每行的非空列名列表 non_null_col_lists = df.apply(lambda row: row.dropna().index.tolist(), axis=1) # 第二步:分别提取第一个和第二个非空列名 df['first'] = non_null_col_lists.str[0].astype('string') df['second'] = non_null_col_lists.str[1].astype('string') print(df)
输出结果
A B C first second 0 1.0 NaN 2.0 A C 1 NaN 1.0 4.0 B C 2 7.0 1.0 2.0 A B
代码解释
df.apply(lambda row: row.dropna().index.tolist(), axis=1):遍历DataFrame的每一行,先删除该行的空值,再把剩下的列名转换成列表。比如第一行处理后得到['A', 'C']。non_null_col_lists.str[0]:从每个列表中取第一个元素,对应你要的first列;str[1]取第二个元素,就是second列。- 最后用
astype('string')把结果转换成字符串类型,和你原来的处理方式保持一致。
额外提示
如果你的数据中存在只有1个非空值的行,str[1]会返回NaN。如果需要处理这种情况,可以用fillna()填充默认值,比如:
df['second'] = non_null_col_lists.str[1].astype('string').fillna('No second value')
内容的提问来源于stack exchange,提问作者younggotti
相关产品推荐
相关产品推荐

