Pandas - 在列中找到第一个非空值

48
如果我有一个包含 NULL 或一些非空值的系列,如何查找第一个值不为空的行,以便将数据类型报告给用户。如果该值为非空,则该系列中所有值的数据类型相同。

2
重复:https://dev59.com/N2Ag5IYBdhLWcg3wrMl5 - EdChum
3个回答

68
你可以使用 first_valid_indexloc 进行选择:
s = pd.Series([np.nan,2,np.nan])
print (s)
0    NaN
1    2.0
2    NaN
dtype: float64

print (s.first_valid_index())
1

print (s.loc[s.first_valid_index()])
2.0

# If your Series contains ALL NaNs, you'll need to check as follows:

s = pd.Series([np.nan, np.nan, np.nan])
idx = s.first_valid_index()  # Will return None
first_valid_value = s.loc[idx] if idx is not None else None
print(first_valid_value)
None

如果系列包含重复的索引值,则s.loc[idx]实际上会返回一个系列。@jezrael,您认为是否有一个好的通用解决方案,也适用于这种情况,或者在first_valid_value类型上进行条件判断是不可避免的? - stav
@Stav - 这不是一个容易的问题,或许最好发表一个新的问题。 - jezrael
@jezrael 对于最后一个有效值,您只需反转序列并使用相同的函数即可吗? - jtlz2
1
@jtlz2 - 使用 last_valid_index - jezrael

15

对于一个序列,这将返回第一个非空值:

创建序列s:

s = pd.Series(index=[2,4,5,6], data=[None, None, 2, None])

创建这个Series的函数是:

2    NaN
4    NaN
5    2.0
6    NaN
dtype: float64

你可以通过以下方式获取第一个非 NaN 值:

s.loc[~s.isnull()].iloc[0]

返回

2.0

如果你有一个像这样的dataframe:

df = pd.DataFrame(index=[2,4,5,6], data=np.asarray([[None, None, 2, None], [1, None, 3, 4]]).transpose(), 
                  columns=['a', 'b'])

看起来像这样:

    a       b
2   None    1
4   None    None
5   2       3
6   None    4

使用此方法(针对列a),可以选择每列的第一个非空值:

df.a.loc[~df.a.isnull()].iloc[0]

如果你想要第一行中任何地方都没有Null值,你可以使用以下代码:

df.loc[~df.isnull().sum(1).astype(bool)].iloc[0]

返回:

a    2
b    3
Name: 5, dtype: object

5
您也可以使用get方法。
(Pdb) type(audio_col)
<class 'pandas.core.series.Series'>
(Pdb) audio_col.first_valid_index()
19
(Pdb) audio_col.get(first_audio_idx)
'first-not-nan-value.ogg'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接