【问题标题】:How to reorder columns based on condition如何根据条件对列重新排序
【发布时间】:2021-02-01 02:14:52
【问题描述】:

我是编程新手。我正在网上学习python和pandas。

我是一名 QA,并试图将我的一项手动工作自动化。

我有 2 个数据集。

df1= pd.DataFrame({'number':['c-101','c-102','c-103'],'Summary':['Summary1','Summary2','Summary3']})

df2= pd.DataFrame({'ticket':['c-102','c-103','c-101'],'Summary':['Ticket1','Ticket2','Ticket3'], 'Priority':['High','Low','High']})

df2.ticket 包含与df1.numbers 相似的值,但它被打乱了。

df2df1 长度不同,len(df1) > len(df2)

我正在尝试创建一个新的数据框 (df3),其中:

  • 如果 df1.number = df2.ticket exist :使用 df1(行)对应的 df2.Priority(在新列中)中的所有值更新 df3
  • 如果df1.number = df2.ticket 不存在:更新"NO PRIORITY"

所以我需要遍历df1.number 来检查每个df2.ticket 是否存在。

我试过了:

for i in df2["ticket"]:
    if i in df1["number"]:
        ticket.append(df2["Priority"])
    else:
        ticket.append("NOT CREATED")

输出:df3 包含 Priority = "NOT CREATED" 的所有行(即使对于 df1.number = df2.ticket

非常感谢社区的任何意见。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以为此使用mergejoinpd.concat

    输入数据:

    >>> print(df1)
      number   Summary
    0  c-101  Summary1
    1  c-102  Summary2
    2  c-103  Summary3
    3  c-104  Summary4
    
    >>> print(df2)
      ticket  Summary Priority
    0  c-102  Ticket1     High
    1  c-103  Ticket2      Low
    2  c-101  Ticket3     High
    

    数据框merge

    >>> df3 = df1.merge(df2, how='outer', left_on='number', right_on='ticket')
    >>> df3['Priority'].fillna("NOT CREATED",inplace=True)
    

    数据框join

    >>> df3 = df1.join(df2, how='outer', lsuffix='number',rsuffix='ticket')
    >>> df3['Priority'] = df3['Priority'].fillna("NOT CREATED")
    

    两种情况下的输出:

    >>> print(df3)
      number Summary_x ticket Summary_y     Priority
    0  c-101  Summary1  c-101   Ticket3         High
    1  c-102  Summary2  c-102   Ticket1         High
    2  c-103  Summary3  c-103   Ticket2          Low
    3  c-104  Summary4    NaN       NaN  NOT CREATED
    

    pd.concat

    >>> df3 = pd.concat([df1.set_index('number'),df2.set_index('ticket')],axis=1)
    >>> df3['Priority'] = df3['Priority'].fillna("NOT CREATED")
    
    >>> df3
            Summary  Summary     Priority
    c-101  Summary1  Ticket3         High
    c-102  Summary2  Ticket1         High
    c-103  Summary3  Ticket2          Low
    c-104  Summary4      NaN  NOT CREATED
    

    【讨论】:

      【解决方案2】:

      如果我正确理解了您的问题,这应该可以解决问题:

      df3 = pd.merge(df1, df2, how='left', left_on='number', 'right_on'='ticket')
      df3['Priority'].fillna('NO PRIORITY', inplace=True)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-30
        • 2019-01-24
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多