2017-06-22 70 views
1

我有一個數據框(df1),其中有一列'units',填充了nan空值或字符串。有條件地填充來自不同數據框的數據的熊貓列

df1 
 

 
id s_type s_name s_unit 
 
1 t1  n1  m2 
 
2 t1  n5  m2 
 
3 t2  n2  NaN 
 
4 t6  n3  each

我有一個第二數據幀,(DF2),其具有類似的信息,雖然沒有標識。

df2 
 

 
type name unit 
 
t3 n4 cm2 
 
t4 n2 m3 
 
t2 n2 kg 
 
t6 n0 Nan

我在努力開發一種表達

  1. 識別DF1行,其中單元是空,並從DF2
  2. 插入單元值在給DF1的單位列WHERE
  3. df1 ['type']與df2 ['type']匹配AND df1 ['name']與df2 ['name']匹配

在上述框架中,由於'type'和'name'都匹配,所以表達式將填充df1'unit'列的值爲'kg'。

類似的東西來:

df1.loc[df1['unit'].isnull(), 'unit'] = df2['unit'].where(
 
     (df1['name'] == df2['name']) & 
 
     (df1['type'] == df2['type']))

雖然上面一行是生產 「ValueError異常:只能比較相同標記系列的對象。」

我查看了文檔和其他SO問題。並且處於虧損狀態。任何幫助將非常感激。

回答

1

您可以使用mergeleft join,然後combine_firstfillna

df = pd.merge(df1, df2, on=['type','name'], how='left') 

df1['unit'] = df1['unit'].combine_first(df['unit_y']) 
print (df1) 
    id type name unit 
0 1 t1 n1 m2 
1 2 t1 n5 m2 
2 3 t2 n2 kg 
3 4 t6 n3 each 

df1['unit'] = df1['unit'].fillna(df['unit_y']) 
print (df1) 
    id type name unit 
0 1 t1 n1 m2 
1 2 t1 n5 m2 
2 3 t2 n2 kg 
3 4 t6 n3 each 
+0

替代解決方案看起來更清潔,但似乎沒有在我的最終工作。 fillna()如何知道如何按名稱和類型進行過濾? – yvesva

+0

索引相同,因爲左連接,所以可以使用'df ['unit_y']' – jezrael

+1

謝謝。我最終使用了'df.loc [(df ['unit_x']。isnull(),'unit_x')] = df [unit_y']',並從那裏開始。 – yvesva

1

您可以合併,然後再填寫NA單位從DF2值。

(
    pd.merge(df1,df2,on=['type','name'],how='left',suffixes=['','_y']) 
     .assign(unit=lambda x: x.unit.combine_first(x.unit_y)) 
     .drop('unit_y',1) 
) 
Out[301]: 
    id type name unit 
0 1 t1 n1 m2 
1 2 t1 n5 m2 
2 3 t2 n2 kg 
3 4 t6 n3 each 
相關問題