如果默认列中的行是 NaN,如何从数据框中的其他列中选择行?

How to choose row from other column in dataframe if row from the default column is NaN?

我的数据框由 3 列组成。第三列基于前两列。默认列是第2列。但是如果第2列是NaN,那么我想让第3列用第1列填充。我在条件中添加了第三行,但似乎不起作用。

这是数据框:

df = pd.DataFrame(np.array([[np.nan, 1717], [1749, 1750], [1704, np.nan]]),
                   columns=['a', 'b'])

这是我的代码:

import numpy as np
import pandas as pd
conditions = [
    (df["b"] <= df["a"]), 
    df["b"] > df["a"],
    df["b"] == df["b"].isna()]

choices = [df["b"], df["a"], df["a"]]

df['c'] = np.select(conditions, choices, default=df["b"])
print(df)

这是我的输出:

           a            b      c
0        NaN         1749.0  1749.0
1        1717.0      1750.0  1717.0
2        1704.0      NaN     NaN

但是我想如果填了a或者b就填c。这就是我想要的输出:

           a            b      c
0        NaN         1749.0  1749.0
1        1717.0      1750.0  1717.0
2        1704.0      NaN     1704.0

这似乎有效:

df = pd.DataFrame(np.array([[np.nan, 1717], [1749, 1750], [1704, np.nan]]),
               columns=['a', 'b'])

df['c'] = df.a

for i in range(len(df)):
    if df.a.iloc[i] == np.nan:
        df.c.iloc[i] = df.b.iloc[i]

你只需要对你的第三个条件做一个小改动。 df["b"].isna() 已经 returns TrueFalse,因此 df["b"] == df["b"].isna() 实际上是在检查 df["b"] 的计算结果是否与 boolean 相同(它没有)。

只需删除第三个条件的前半部分。

import numpy as np
import pandas as pd
conditions = [
    (df["b"] <= df["a"]), 
    df["b"] > df["a"],
    df["b"].isna()]

choices = [df["b"], df["a"], df["a"]]

df['c'] = np.select(conditions, choices, default=df["b"])
print(df)

这个解决方案给出了你想要的输出:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.array([[np.nan, 1717], [1749, 1750], [1704, np.nan]]),
                   columns=['a', 'b'])

def fill_row(row):
    if pd.isnull(row['a']): 
        return row['b']
    else: 
        return row['a']

df['c'] = df.apply(lambda row : fill_row(row), axis=1) 
print(df)

输出:

        a       b       c
0     NaN  1717.0  1717.0
1  1749.0  1750.0  1749.0
2  1704.0     NaN  1704.0