【问题标题】:Conditionally filling pandas column with data from different dataframe有条件地用来自不同数据帧的数据填充 pandas 列
【发布时间】:2017-11-25 06:18:31
【问题描述】:

我有一个数据框 (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),它具有类似的信息,但没有 ID。

df2

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

我正在努力开发一种表达方式

  1. 识别 df1 中单位为空 AND 的行
  2. 将 df2 中的单位值插入到 df1 WHERE 的单位列中
  3. df1['type'] 匹配 df2['type'] AND df1['name'] 匹配 df2['name']

在上面的帧中,表达式将使用“kg”的值填充 df1 的“unit”列,因为“type”和“name”都匹配。

类似于:

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

虽然上面的行产生了“ValueError: Can only compare the same-labeled Series objects。”

我查看了文档和其他 SO 问题。我不知所措。任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas


    【解决方案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
    

    【讨论】:

    • 替代解决方案看起来更干净,但似乎对我不起作用。 fillna() 是如何知道如何按名称和类型进行过滤的?
    • 索引相同,因为左连接,所以可以使用df['unit_y']
    • 谢谢。我最终使用df.loc[(df['unit_x'].isnull(), 'unit_x')] = df[unit_y'] 并从那里开始。
    【解决方案2】:

    你可以先合并,然后用df2中的值填入单元中的na。

    (
         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
    

    【讨论】:

      猜你喜欢
      • 2018-11-02
      • 2022-07-06
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      相关资源
      最近更新 更多