【问题标题】:Pandas dataframe keep rows with certain conditions met else keep whatever is available熊猫数据框保留满足某些条件的行,否则保留任何可用的
【发布时间】:2020-06-11 08:11:54
【问题描述】:

我有以下名为 df1 的数据框:

    name    shortname location   type
0   TexasA  TXA       Canada     Main
1   TexasA  TXA       US         Main
2   TexasA  TXA ZZ    US         Sub-par
3   TexasA  TXA ZZ 2  US         Sub-par2
4   Oregon  ORGN      US         Main
5   Ontario ONT2      Canada     Sub-par
...........

然后我有以下名为 df2 的数据框:

    name    country
0   TexasA  US
1   Oregon  US
2   Ontario Canada
...........

我希望合并名称上的数据框,最终的数据框应保留以下数据框:

    name    shortname
0   TexasA  TXA
1   Oregon  ORGN
2   Ontario ONT2
...........

现在当我使用以下命令进行合并时,

finaldf = pd.merge(df2,df1,on=['name','shortname'],how='out')

,我剩下以下内容:

    name    shortname location   type
1   TexasA  TXA       US         Main
2   TexasA  TXA ZZ    US         Sub-par
3   TexasA  TXA ZZ 2  US         Sub-par2
4   Oregon  ORGN      US         Main
6   Ontario ONT2      Canada     Sub-par

我只想保留 Main 类型的那些,如果它不可用,我想保留任何可用的,类型可能低于标准但它可能是其他东西,我该如何完成?

【问题讨论】:

    标签: python pandas dataframe filter


    【解决方案1】:

    IIUC 您想从df1 中为相同的name 和contry/location 和type 'Main' 获取每一行df2 的shortname。如果df1 中没有这样的条目,那么对于任何其他类型都是一样的。您可以通过进行两次合并来做到这一点,然后使用 combine_first 用第二个结果中的相应值填充第一个结果中的缺失值:

    df_main = df1[df1.type.eq('Main')].merge(df2, left_on=['name','location'], right_on=['name','country'], how='right')
    df_sub = df1[df1.type.ne('Main')].merge(df2, left_on=['name','location'], right_on=['name','country'], how='right')
    df_main.combine_first(df_sub).dropna()[['name', 'shortname']]
    

    结果:

          name shortname
    0   TexasA       TXA
    1   Oregon      ORGN
    2  Ontario      ONT2
    

    【讨论】:

      猜你喜欢
      • 2016-09-10
      • 2020-11-14
      • 2019-04-01
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      相关资源
      最近更新 更多