合并两个不重叠的 pandas 数据框列

Merging two non-overlapping pandas dataframe columns

我有一个 pandas 数据框,其中有一对列,其中每一行的一个单元格是 nan,另一个不是。它看起来像这样:

Var1 Var2
0 3
1 8
2 6
3 4
4 2
5 6

我想在没有 nans 的情况下将这两列合并为一列:

Var1
0 3
1 8
2 6
3 4
4 2
5 6

有什么想法吗?

使用 fillna,将 values 参数设置为另一个系列。

df['Var1'].fillna(df['Var2'], inplace=True)
df['Var1']

#    Var1
# 0  3
# 1  8
# 2  6
# 3  4
# 4  2
# 5  6

您可以按照

的方式利用 numpy 完成此任务
import numpy as np
import pandas as pd
df = pd.DataFrame({'v1':[np.nan,2,np.nan,4],'v2':[1,np.nan,3,np.nan]})
df['v'] = np.where(np.isnan(df.v1),df.v2,df.v1)
print(df)

输出

    v1   v2    v
0  NaN  1.0  1.0
1  2.0  NaN  2.0
2  NaN  3.0  3.0
3  4.0  NaN  4.0

您可以 stack 默认情况下会丢弃 NaN 的框架。然后你可以用它的值构造一个新的框架:

>>> new_df = pd.DataFrame(df.stack().to_numpy(), columns=["Var1"])
>>> new_df

   Var1
0   3.0
1   8.0
2   6.0
3   4.0
4   2.0
5   6.0

另一个版本:

df = df.transform(sorted, key=pd.isna, axis=1).dropna(axis=1, how="all")
print(df)

打印:

      ID  var1
0  103.0  11.0
1  104.0  16.0
2  105.0  71.0
3  106.0   2.0
3  107.0   1.0

另一种方法 - 如果您只有两列。

df.assign(Var1=df.sum(axis=1))[['Var1']]

   Var1
0   3.0
1   8.0
2   6.0
3   4.0
4   2.0
5   6.0