我有这两个数据帧,cd2和cd3。我想将cd3中的cat_gm列添加到cd2:
cd2
cat rand freq _merge
7 21 0.810730 2 left_only
8 21 0.591324 3 left_only
12 22 0.083941 3 left_only
13 22 0.378123 4 left_only
cd3
cat freq cat_gm _merge
14 11 2 11.0 right_only
15 12 3 12.0 right_only
16 12 4 12.0 right_only
17 12 5 12.0 right_only
为了获得我的目标,我尝试了以下代码:
cd2['cat_gm']=pd.Series(cd3['cat_gm'])
cd2
cat rand freq _merge cat_gm
7 21 0.810730 2 left_only NaN
8 21 0.591324 3 left_only NaN
12 22 0.083941 3 left_only NaN
13 22 0.378123 4 left_only NaN
正如你所看到的,我得到的只是缺少值。我想要这个:
cd2['cat_gm']=pd.Series(cd3['cat_gm'])
cd2
Out[13]:
cat rand freq _merge cat_gm
7 21 0.810730 2 left_only 11.0
8 21 0.591324 3 left_only 12.0
12 22 0.083941 3 left_only 12.0
13 22 0.378123 4 left_only 12.0
我哪里出错了?
以下代码是我首先创建cd2和cd3的方法:
import pandas as pd
import numpy as np
a=pd.DataFrame({'cat':[11,12,21,22],'freq':[2,3,4,5]})
b=pd.DataFrame({'cat':[11,12,21,22],'freq':[3,6,2,3]})
c=pd.Series.to_frame(np.repeat(a['cat'],a['freq']))
d=pd.Series.to_frame(np.repeat(b['cat'],b['freq']))
c['rand']=np.random.uniform(0,1,len(c.index))
c['freq']=c.groupby('cat').cumcount()
d['freq']=d.groupby('cat').cumcount()
c.sort_values(by=['rand'])
d['cat_gm']=d['cat']
cd=pd.merge(c,d,on=['cat','freq'],how='outer',indicator=True)
cd1=cd[cd._merge=='both']
cd2=cd[pd.isna(cd['cat_gm'])==True]
cd2=cd2.drop(['cat_gm'],axis=1)
cd3=cd[pd.isna(cd['rand'])==True]
cd3=cd3.drop(['rand'],axis=1)
答案 0 :(得分:0)
Pandas正在加入索引上的数据,但您的系列与父数据框的索引不同。相反,你可以为它提供一个数据块。
cd2['cat_gm'] = cd3['cat_gm'].values
答案 1 :(得分:0)
首先你需要reset_index,
cd2 = cd2.reset_index(drop=True)
cd3 = cd3.reset_index(drop=True)
然后使用pd.concat
将列从一个数据帧复制到另一个数据帧
new_df = pd.concat([cd2, cd3[['cat_gm']]], axis=1)
现在你得到了你需要的东西,
print(new_df)
,结果,
cat rand freq _merge cat_gm
0 21 0.102928 2 left_only 11.0
1 21 0.803516 3 left_only 12.0
2 22 0.054483 3 left_only 12.0
3 22 0.724568 4 left_only 12.0