获取每行的第一个非空值

qqqwww:

我有一个示例数据框显示如下。对于每一行,我想先检查c1,如果它不为null,则检查c2。通过这种方式,找到第一个非空列并将该值存储到列结果中。

ID  c1  c2  c3  c4  result
1   a   b           a
2       cc  dd      cc
3           ee  ff  ee
4               gg  gg

我现在正在使用这种方式。但是我想知道是否有更好的方法。(列名没有任何模式,这只是示例)

df["result"] = np.where(df["c1"].notnull(), df["c1"], None)
df["result"] = np.where(df["result"].notnull(), df["result"], df["c2"])
df["result"] = np.where(df["result"].notnull(), df["result"], df["c3"])
df["result"] = np.where(df["result"].notnull(), df["result"], df["c4"])
df["result"] = np.where(df["result"].notnull(), df["result"], "unknown)

当有很多列时,此方法看起来不好。

耶斯雷尔:

首先使用回填NaNs,然后通过iloc以下方式选择第一列

df['result'] = df[['c1','c2','c3','c4']].bfill(axis=1).iloc[:, 0].fillna('unknown')

要么:

df['result'] = df.iloc[:, 1:].bfill(axis=1).iloc[:, 0].fillna('unknown')

print (df)
   ID   c1   c2  c3   c4 result
0   1    a    b   a  NaN      a
1   2  NaN   cc  dd   cc     cc
2   3  NaN   ee  ff   ee     ee
3   4  NaN  NaN  gg   gg     gg

性能

df = pd.concat([df] * 1000, ignore_index=True)


In [220]: %timeit df['result'] = df[['c1','c2','c3','c4']].bfill(axis=1).iloc[:, 0].fillna('unknown')
100 loops, best of 3: 2.78 ms per loop

In [221]: %timeit df['result'] = df.iloc[:, 1:].bfill(axis=1).iloc[:, 0].fillna('unknown')
100 loops, best of 3: 2.7 ms per loop

#jpp solution
In [222]: %%timeit
     ...: cols = df.iloc[:, 1:].T.apply(pd.Series.first_valid_index)
     ...: 
     ...: df['result'] = [df.loc[i, cols[i]] for i in range(len(df.index))]
     ...: 
1 loop, best of 3: 180 ms per loop

#cᴏʟᴅsᴘᴇᴇᴅ'  s solution
In [223]: %timeit df['result'] = df.stack().groupby(level=0).first()
1 loop, best of 3: 606 ms per loop

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

熊猫列列表中每行的第一个非空值

从前一个空值开始获取第一个非空值的延迟

获取每行最后一个非空列的值

返回第一个非空/空白值?

获取组中的第一个非空值

按功能分组后获取第一个非空值

如何获取Java中的第一个非空值?

PySpark:获取数据框中每个列的第一个非空值

如何从foreach PHP中获取第一个非空过滤值?

如何使用Oracle SQL获取多个列中的第一个非零/非空值和最后一个零/非空值

识别Pandas DataFrame每行中的第一个和所有非零值

dplyr:需要帮助返回每行中第一个非NA值的列索引

如何查找和替换每行的第一个空值?

如何使用列的第一个非空值获取其他列值?

从选定的行中为每一列获取第一个非空值

SQL Server 2008 R2:从列中获取第一个非空值

从索引指定的特定列中获取第一个非空值。电子表格

Excel公式获取第一个和最后一个非零值

如何在excel中获得第一个非空/空值

我可以插入特定值来替换每行中的第一个非NULL值吗

Pandas:用第一个非空值为用户填写列的值

使用合并从2个表中返回第一个非空值

问:从excel中的第一个非空值开始一行

Python数据框获取每行最后一个非空列的值

Excel公式获取行中的第一个和最后一个非空值并返回列标题

如何获取列表中的第一个非空项目

MySQL - 从多个 where 子句中获取第一个非空结果

C#按优先级获取第一个非空属性

Postgres:JOIN与第一个非空值匹配吗?