如果默认列中的行是 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 True
或 False
,因此 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
我的数据框由 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 True
或 False
,因此 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