2016-09-13 5 views
0

私は今、私はすなわちabccolumn1最初の値を使用して、この値を検索したい2つのデータフレームに、すなわちDF1とDF2長さが等しくない2つの異なるパンダのデータフレームを比較するにはどうすればよいですか?

df1:         df2: 

    Column1 Column2    ColumnA ColumnB 
0 abc  a    0 stu  aaa 
1 pqr  b    1 mno  bbb 
2 stu  c    2 pqr  ccc 
3 mno  d    3 abc  ddd 
4 xyz  e    4 xyz  eee 
           5 uiq  fff 
           6 mls  ggg 
           7 qww  hhh 
           8 dfg  iii 

を抱えているがdf2columnAで利用可能です。一致が見つかった場合は、一致する行の値columnBを別の1つの列にdf1とします。 (注 - column1のすべてのエントリは、すぐに利用できますか、またはdf2columnAにはありません)。

出力フォーマット:

df1 : 
Column1 Column2 Column3 
0 abc  a  ddd 
1 pqr  b  ccc 
2 stu  c  aaa 
3 mno  d  bbb 
4 xyz  e  eee 

私は別のシナリオを試してみました。

df['column1'] == df['columnA'] 

両方のデータフレームの長さが同じではありませんので、私はエラーを取得しています:私は、これは以下のようにデータフレームを比較しようとします。私はこのタイプの操作をpandasデータフレームでどのように実行できますか?

+0

は申し訳ありませんが、あなたはちょうど同じ結果を達成するために、 '' df1.merge(DF2)で行うことはできませんか? – EdChum

答えて

2

私はあなたがmergeが必要だと思うが、最初の列ColumnAと最後ColumnBの名前を変更します。

print (pd.merge(df1,df2.rename(columns={'ColumnA':'Column1'})) 
     .rename(columns={'ColumnB': 'Column3'})) 

    Column1 Column2 Column3 
0  abc  a  ddd 
1  pqr  b  ccc 
2  stu  c  aaa 
3  mno  d  bbb 
4  xyz  e  eee 

パラメータleft_onright_onのもう一つの解決策が、必要であるdropColumnA

print (pd.merge(df1,df2, left_on='Column1', right_on='ColumnA') 
     .drop('ColumnA', axis=1) 
     .rename(columns={'ColumnB': 'Column3'})) 

    Column1 Column2 Column3 
0  abc  a  ddd 
1  pqr  b  ccc 
2  stu  c  aaa 
3  mno  d  bbb 
4  xyz  e  eee 

コメントによる編集:

参加した値が重複している場合は、行が掛け合わされています。

import pandas as pd 

data = [['abc','a'], ['pqr','b'], ['pqr','b'], ['pqr','b']] 
df1 = pd.DataFrame(data, columns=['Column1','Column2']) 


df2 = pd.DataFrame({'ColumnA': {0: 'stu', 1: 'pqr', 2: 'pqr'}, 
        'ColumnB': {0: 'aaa', 1: 'ccc', 2: 'ccc'}}) 


print (df1) 
    Column1 Column2 
0  abc  a 
1  pqr  b 
2  pqr  b 
3  pqr  b 

print (df2) 
    ColumnA ColumnB 
0  stu  aaa 
1  pqr  ccc 
2  pqr  ccc 

print (pd.merge(df1,df2.rename(columns={'ColumnA':'Column1'})) 
     .rename(columns={'ColumnB': 'Column3'})) 

    Column1 Column2 Column3 
0  pqr  b  ccc 
1  pqr  b  ccc 
2  pqr  b  ccc 
3  pqr  b  ccc 
4  pqr  b  ccc 
5  pqr  b  ccc 

次に使用可能性drop_duplicatesは次のとおりです。

print (df1) 
    Column1 Column2 
0  abc  a 
1  pqr  b 
2  pqr  b 
3  pqr  b 

df1 = df1.drop_duplicates() 
print (df1) 
    Column1 Column2 
0  abc  a 
1  pqr  b 

print (df2) 
    ColumnA ColumnB 
0  stu  aaa 
1  pqr  ccc 
2  pqr  ccc 

df2 = df2.drop_duplicates() 
print (df2) 
    ColumnA ColumnB 
0  stu  aaa 
1  pqr  ccc 

print (pd.merge(df1,df2.rename(columns={'ColumnA':'Column1'})) 
     .rename(columns={'ColumnB': 'Column3'})) 

    Column1 Column2 Column3 
0  pqr  b  ccc 

はEDIT1:

DataFramesは、複数の列を持っている場合は、結合を指定重要ですパラメータごとの列on

print (pd.merge(df1,df2.rename(columns={'ColumnA':'Column1'}), on='Column1') 
     .rename(columns={'ColumnB': 'Column3'})) 

EDIT2:

選択した列にNaNで行を削除が必要な場合dropnaを使用します。

df = pd.DataFrame({'A':[1,2,3], 
        'B':[4,5,np.nan], 
        'C':[7,8,np.nan], 
        'D':[np.nan,3,5], 
        'E':[5,3,6], 
        'F':[7,4,3]}) 

print (df) 
    A B C D E F 
0 1 4.0 7.0 NaN 5 7 
1 2 5.0 8.0 3.0 3 4 
2 3 NaN NaN 5.0 6 3 

print (df.dropna(subset=['C','B'])) 
    A B C D E F 
0 1 4.0 7.0 NaN 5 7 
1 2 5.0 8.0 3.0 3 4 
+0

これは非常に小さな問題ですが、最終的な '.rename(columns = {'ColumnB': 'Column3'})'が抜けて出力が正確に一致していないようです。 –

+0

はい、私はそれをやっています。ありがとうございました。 – jezrael

+0

@ jezrael-私のorifinal meand df dataframe.shapeは(67387、29)を返します。 result.shapeは(98778、80)を返します。なぜdataframe df1行が同じではないのですか? – kit

関連する問題