.
以下 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