2016-09-09 2 views
3

私はPandasを使ってテーブルを処理しています。Pandasで別のテーブルの属性を追加する

[table1] 
    sample1 sample2 sample3 
A 11  22  33 
B 1  2  3 

[table2] 
    sample3 sample4 sample2 
D 333  444  222 

[Result] 
    sample1 sample2 sample3 
A 11  22  33 
B 1  2  3 
D NaN  222  333 

私は2つのテーブルを持っている、と私は、列名を考慮すると、表1に(表2の)行Dを追加します。表1の列が表2に存在する場合、対応する値Dが表2に追加されます。表の列が表1のように存在しない場合は、Dの値が設定されますNaNに設定するか無視してください。

パンダでこれを行う簡単な方法はありますか?

答えて

3

私はあなたがconcatを使用して、dropで列sample4を削除することができると思います。

print (pd.concat([table1, table2]).drop('sample4', axis=1)) 
    sample1 sample2 sample3 
A  11.0  22  33 
B  1.0  2  3 
D  NaN  222  333 

あなたは両方DataFramesの列を選択するためのintersectionを使用して、これらの列によってtable2の連結サブセットすることができます

print (table2.columns.intersection(table1.columns)) 
Index(['sample2', 'sample3'], dtype='object') 

print (pd.concat([table1,table2[table2.columns.intersection(table1.columns)]])) 
    sample1 sample2 sample3 
A  11.0  22  33 
B  1.0  2  3 
D  NaN  222  333 

次に、必要があればNaNの行を削除するにはdropna

あなたが最初のsubselecting列によってjezraelの answer table1である table2から一般化することができます
print (pd.concat([table1, table2]).drop('sample4', axis=1).dropna()) 
    sample1 sample2 sample3 
A  11.0  22  33 
B  1.0  2  3 
+0

を私は列の値をルックアップする必要があると思ったが、連結が簡単で、非常に直感的です。あなたの答えをありがとう。 – z991

+0

うれしいことができますよ! – jezrael

3

。これはnumpy.in1dを使用してきれいに行われます。これはまた、両方のデータフレームからの列を有する潜在的に巨大な一時データフレームを形成することを回避する。例:

印刷し
import numpy as np 
import pandas as pd 

table1 = pd.DataFrame([[11, 22, 33], [1, 2, 3]], index=list('AB'), columns=['sample1', 'sample2', 'sample3']) 
table2 = pd.DataFrame([[333, 444, 222]], index=['D'], columns=['sample3', 'sample4', 'sample2']) 

# Sub-select columns... 
cols_in_table1 = table2.columns[np.in1d(table2.columns, table1.columns)] 

# ... and concatenate. 
results = pd.concat((table1, table2[cols_in_table1])) 

print(results) 

sample1 sample2 sample3 
A  11.0  22  33 
B  1.0  2  3 
D  NaN  222  333 
+0

サブ列の選択には非常に便利です。 in1d関数に関するご意見ありがとうございます。 – z991

関連する問題