【Python】np.where用法實例:求每行第一個不爲空的單元格值

.
以下 Python 代碼,用來求出每行第一個不爲空的單元格值。

# 求每行第一個不爲空的單元格值

import pandas as pd
import numpy as np
df = pd.DataFrame({"第一列":[100, np.NaN, 500, np.NaN, 120 ],
                  "第二列":[200, 200, np.NaN, 200, 150],
                  "第三列":[np.NaN, 300, 700, np.NaN, 16]})

print("我是原表:\n", df)
print("\n")

# dataframe 轉爲 array數組,相當於一行一個小list
c = df.values
df["求值"] = [c[x][np.where(~np.isnan(c[x]))][0] for x in range(len(df))]

print("我是成果表(求值):")
df

求每行第一個不爲空的單元格值

代碼解析

主要的代碼就這一句:

df["求值"] = [c[x][np.where(~np.isnan(c[x]))][0] for x in range(len(df))]

爲了詳細解釋下,我把這句拆成幾個語句:

# 以 c[0] 爲例,判斷 c[0] 中哪些單元格爲空, 加上 ~ 符號表示取反,即不爲空。
# 輸出爲一個一維bool數組,即 [False,  True,  True]
~np.isnan(c[0])

Output:
array([ True, True, False])

# c[0][條件] 表示篩選出符合條件的單元格。
c[0][np.where(~np.isnan(c[0]))]

Output:
array([100., 200.])

c[1][np.where(~np.isnan(c[1]))]

Output:
array([200., 300.])

c[2][np.where(~np.isnan(c[2]))]

Output:
array([500., 700.])

以看到經過上面幾個步驟,每行不爲空的單元格都被篩選出了,而我們要求的是第一個值,所以加上索引:

c[2][np.where(~np.isnan(c[2]))][0]

Output:
500.0
接下來利用 for 循環,將所有的行都計算一遍,並將計算結果格式化爲list:

[c[x][np.where(~np.isnan(c[x]))][0] for x in range(len(df))]

Output:
[100.0, 200.0, 500.0, 200.0, 120.0]
這就是我們要的不爲空的第一個單元格值了。

關於np.where 更全面的用法,見 https://www.zhihu.com/question/62844162/answer/300561552

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章