2017-12-22 4 views
0

이 두 데이터 프레임, cd2 및 cd3이 있습니다. 내가 CD3에서 CD2에 cat_gm 열을 추가 할 :하나의 데이터 프레임에서 다른 파이썬으로 열을 추가하려하지만 성공하지 못했습니다.

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  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 
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

팬더에서 열을 계열에 할당하면 해당 인덱스를 기반으로 할당됩니다. 색인이 일치하지 않기 때문에 NaN을 사용합니다. –

+0

고마워요, 고쳐주세요. 'cat_gm = cd3 ['cat_gm ']. as_matrix() cd2 ['cat_gm '] = cat_gm' –

답변

0

팬더 인덱스의 데이터를 합류하지만 시리즈가 상위 데이터 프레임과 같은 인덱스가 없습니다. 대신 당신은 그것을 데이터의 열등한 배열로 공급할 수 있습니다. 당신이 reset_index에있는

cd2['cat_gm'] = cd3['cat_gm'].values 
+0

감사합니다. –

0

먼저, 다음

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 
관련 문제