2017-06-22 75 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 
相关问题