【问题标题】:Merging two non-overlapping pandas dataframe columns合并两个不重叠的熊猫数据框列
【发布时间】:2021-09-13 14:37:28
【问题描述】:
我有一个带有一对列的 pandas 数据框,在每一行中,一个单元格是 nan 而另一个不是。它看起来像这样:
|
Var1 |
Var2 |
| 0 |
3 |
nan |
| 1 |
8 |
nan |
| 2 |
nan |
6 |
| 3 |
4 |
nan |
| 4 |
nan |
2 |
| 5 |
nan |
6 |
我想在没有 nan 的情况下将这两列合并为一列:
|
Var1 |
| 0 |
3 |
| 1 |
8 |
| 2 |
6 |
| 3 |
4 |
| 4 |
2 |
| 5 |
6 |
有什么想法吗?
【问题讨论】:
标签:
python
pandas
dataframe
nan
【解决方案1】:
使用fillna,将values参数设置为另一个Series。
df['Var1'].fillna(df['Var2'], inplace=True)
df['Var1']
# Var1
# 0 3
# 1 8
# 2 6
# 3 4
# 4 2
# 5 6
【解决方案2】:
您可以按照以下方式利用 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
【解决方案3】:
您可以stack 默认情况下将丢弃NaNs 的框架。然后你可以用它的值构造一个新的框架:
>>> 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
【解决方案4】:
另一个版本:
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
【解决方案5】:
另一种方法 - 如果您只有两列。
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