Python:如何通过只保留常量信息来连接两个数据帧?



我有两个数据帧

df1 
A    B    C    id    val
0    ar    2    3     1    3.2
1    ar    3    3     1    5.6
3    ar    0    3     2    7.8 
4    ar    4    3     2    9.2
5    ar    5    3     2    3.4
df2
id   val
0     1   3.3
1     2   6.4

我想在df1中添加一行df2的信息,并为值不变的列保持相同的值,而nan为具有不同值的列。

最后我希望有

df3 
A    B    C    id    val
0   ar    2    3     1    3.2
1   ar    3    3     1    5.6
3   ar    0    3     2    7.8 
4   ar    4    3     2    9.2
5   ar    5    3     2    3.4
6   ar   nan   3     1    3.3
7   ar   nan   3     2    6.4

对于常量列,您可以比较第一行的所有行,因此在concat之后将它们添加到df2:

c = df1.iloc[[0], df1.eq(df1.iloc[0]).all().to_numpy()].squeeze()
print (c)
A    1
C    3
Name: 0, dtype: int64

df = pd.concat([df1, df2.assign(**c)], ignore_index=True)
print (df)
A    B  C  id  val
0  1  2.0  3   1  3.2
1  1  3.0  3   1  5.6
2  1  0.0  3   2  7.8
3  1  4.0  3   2  9.2
4  1  5.0  3   2  3.4
5  1  NaN  3   1  3.3
6  1  NaN  3   2  6.4

一种方法是使用np.unique()创建df1中只有1个值的列的列表,在df2中创建这些列,并在df1和df2中创建pd.concat():

eq_cols = []
[eq_cols.append(col) for col in df1.columns if len(np.unique(df1[col]))==1]
df2[eq_cols] = df1[eq_cols]
>>> pd.concat([df1,df2],axis=0)
A    B  C  id  val
0  ar  2.0  3   1  3.2
1  ar  3.0  3   1  5.6
2  ar  0.0  3   2  7.8
3  ar  4.0  3   2  9.2
4  ar  5.0  3   2  3.4
0  ar  NaN  3   1  3.3
1  ar  NaN  3   2  6.4

相关内容

  • 没有找到相关文章

最新更新