Pandas select 两列之一的首选值以创建新列
Pandas select preferred value from one of two columns to make a new column
我有一个 Pandas DataFrame,其中包含两列 "complementary" 数据。对于任何给定的行,有 3 种可能性:
1) 列 A
有一个非空值,列 B 有一个空值 NaN
,我想用列 [=15] 中的非空值替换=].
2) 列 A
有一个空值 NaN
,我想将其替换为列 B
.
中的非空值
3) A
和 B
两列都有空值 NaN
,这意味着我将保留 NaN
作为该行的值。
这是我的 DataFrame 的简化版本:
df1 = pd.DataFrame({'A' : ['keep1', np.nan, np.nan, 'keep4', np.nan],
'B' : [np.nan, 'keep2', np.nan, np.nan, np.nan]})
我想作为一个中间步骤,我会创建一个新列 C
,其中包含我需要的条目:
df2 = pd.DataFrame({'A' : ['keep1', np.nan, np.nan, 'keep4', np.nan],
'B' : [np.nan, 'keep2', np.nan, np.nan, np.nan],
'C' : ['keep1', 'keep2', np.nan, 'keep4', np.nan]}
然后我会删除前两行 A
和 B
:
df_final = df2.drop(['A', 'B'], axis=1)
我的实际 DataFrame 有数百行,我尝试了几种方法(布尔过滤器、使用 iterrows
遍历 DataFrame、使用 DataFrame.where()
)但都没有成功。我认为这将是一个简单的问题,但我没有看到。感谢任何帮助。
谢谢
您可以使用 combine_first()
从 B 填补 A 中的空白:
df1['C'] = df1['A'].combine_first(df1['B'])
#0 keep1
#1 keep2
#2 NaN
#3 keep4
#4 NaN
使用 Series.fillna
将 A
中的缺失值替换为 B
值:
df1['C'] = df1.A.fillna(df1.B)
print (df1)
A B C
0 keep1 NaN keep1
1 NaN keep2 keep2
2 NaN NaN NaN
3 keep4 NaN keep4
4 NaN NaN NaN
为避免 drop
可能使用 DataFrame.pop
提取列:
df1['C'] = df1.pop('A').fillna(df1.pop('B'))
print (df1)
C
0 keep1
1 keep2
2 NaN
3 keep4
4 NaN
我有一个 Pandas DataFrame,其中包含两列 "complementary" 数据。对于任何给定的行,有 3 种可能性:
1) 列 A
有一个非空值,列 B 有一个空值 NaN
,我想用列 [=15] 中的非空值替换=].
2) 列 A
有一个空值 NaN
,我想将其替换为列 B
.
中的非空值
3) A
和 B
两列都有空值 NaN
,这意味着我将保留 NaN
作为该行的值。
这是我的 DataFrame 的简化版本:
df1 = pd.DataFrame({'A' : ['keep1', np.nan, np.nan, 'keep4', np.nan],
'B' : [np.nan, 'keep2', np.nan, np.nan, np.nan]})
我想作为一个中间步骤,我会创建一个新列 C
,其中包含我需要的条目:
df2 = pd.DataFrame({'A' : ['keep1', np.nan, np.nan, 'keep4', np.nan],
'B' : [np.nan, 'keep2', np.nan, np.nan, np.nan],
'C' : ['keep1', 'keep2', np.nan, 'keep4', np.nan]}
然后我会删除前两行 A
和 B
:
df_final = df2.drop(['A', 'B'], axis=1)
我的实际 DataFrame 有数百行,我尝试了几种方法(布尔过滤器、使用 iterrows
遍历 DataFrame、使用 DataFrame.where()
)但都没有成功。我认为这将是一个简单的问题,但我没有看到。感谢任何帮助。
谢谢
您可以使用 combine_first()
从 B 填补 A 中的空白:
df1['C'] = df1['A'].combine_first(df1['B'])
#0 keep1
#1 keep2
#2 NaN
#3 keep4
#4 NaN
使用 Series.fillna
将 A
中的缺失值替换为 B
值:
df1['C'] = df1.A.fillna(df1.B)
print (df1)
A B C
0 keep1 NaN keep1
1 NaN keep2 keep2
2 NaN NaN NaN
3 keep4 NaN keep4
4 NaN NaN NaN
为避免 drop
可能使用 DataFrame.pop
提取列:
df1['C'] = df1.pop('A').fillna(df1.pop('B'))
print (df1)
C
0 keep1
1 keep2
2 NaN
3 keep4
4 NaN