我有两个数据帧
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