【问题标题】:pandas create a flag when merging two dataframespandas 在合并两个数据帧时创建一个标志
【发布时间】:2018-06-14 10:16:21
【问题描述】:

我有两个df - df_adf_b

# df_a
number    cur
1000      USD
2000      USD
3000      USD

# df_b
number    amount    deletion
1000      0.0       L
1000      10.0      X
1000      10.0      X
2000      20.0      X
2000      20.0      X
3000      0.0       L
3000      0.0       L

我想将df_adf_b 合并,

df_a = df_a.merge(df_b.loc[df_b.deletion != 'L'], how='left', on='number')
df_a.fillna(value={'amount':0}, inplace=True)

还要在结果df_a 中创建一个名为deleted 的标志,它具有三个可能的值-fullpartialnone

full - 如果所有行都与特定的number 值关联,则具有deletion = L

partial - 如果某些行与特定的number 值相关联,则具有deletion = L

none - 没有与特定number 值关联的行,有deletion = L

在进行合并时,不应考虑来自df_bdeletion = L 的行;所以结果看起来像,

 number    amount    deletion    deleted    cur
 1000      10.0      X           partial    USD
 1000      10.0      X           partial    USD
 2000      20.0      X           none       USD
 2000      20.0      X           none       USD
 3000      0.0       NaN         full       USD

我想知道如何实现这一点。

【问题讨论】:

    标签: python-3.x pandas dataframe merge


    【解决方案1】:

    想法是比较deletion 列和聚合allany,为新列创建助手 dictionary 和最后一个 map

    g = df_b['deletion'].eq('L').groupby(df_b['number'])
    m1 = g.any()
    m2 = g.all()
    
    d1 = dict.fromkeys(m1.index[m1 & ~m2], 'partial')
    d2 = dict.fromkeys(m2.index[m2], 'full')
    #join dictionries together
    d = {**d1, **d2}
    print (d)
    {1000: 'partial', 3000: 'full'}
    
    df = df_a.merge(df_b.loc[df_b.deletion != 'L'], how='left', on='number')
    df['deleted'] = df['number'].map(d).fillna('none')
    print (df)
       number  cur  amount deletion  deleted
    0    1000  USD    10.0        X  partial
    1    1000  USD    10.0        X  partial
    2    2000  USD    20.0        X     none
    3    2000  USD    20.0        X     none
    4    3000  USD     NaN      NaN     full
    

    对于指定列none,如果要为其创建字典:

    d1 = dict.fromkeys(m1.index[m1 & ~m2], 'partial')
    d2 = dict.fromkeys(m2.index[m2], 'full')
    d3 = dict.fromkeys(m2.index[~m1], 'none')
    d = {**d1, **d2, **d3}
    print (d)
    {1000: 'partial', 3000: 'full', 2000: 'none'}
    
    df = df_a.merge(df_b.loc[df_b.deletion != 'L'], how='left', on='number')
    df['deleted'] = df['number'].map(d)
    print (df)
       number  cur  amount deletion  deleted
    0    1000  USD    10.0        X  partial
    1    1000  USD    10.0        X  partial
    2    2000  USD    20.0        X     none
    3    2000  USD    20.0        X     none
    4    3000  USD     NaN      NaN     full
    

    【讨论】:

      猜你喜欢
      • 2018-09-30
      • 2021-08-16
      • 2012-07-23
      • 2016-03-02
      • 2022-11-25
      • 1970-01-01
      • 2018-05-03
      • 2022-01-07
      • 2020-05-05
      相关资源
      最近更新 更多