Python 基于其他列的内容创建新列

Python 基于其他列的内容创建新列,python,pandas,Python,Pandas,我有一个数据框,如图所示 我想创建一个名为Result 应根据以下规则创建结果 返回基于D、F、M、P列显示最多的值 如果IG和HY之间存在关联,则返回HY 不要将NaN计为一个值 生成的数据帧如下所示: 一个可能的解决方案如下。也许它不是最优雅的,但它很管用。 只有一个问题,如果在一行中你有所有的NaN,那么你将得到该行的“HY” import numpy as np import pandas as pd df_start = pd.DataFrame({'P':['IG','HY',

我有一个数据框,如图所示

我想创建一个名为
Result

应根据以下规则创建结果

  • 返回基于D、F、M、P列显示最多的值
  • 如果
    IG
    HY
    之间存在关联,则返回
    HY
  • 不要将
    NaN
    计为一个值
  • 生成的数据帧如下所示:


    一个可能的解决方案如下。也许它不是最优雅的,但它很管用。 只有一个问题,如果在一行中你有所有的NaN,那么你将得到该行的“HY”

    import numpy as np
    import pandas as pd
    
    df_start = pd.DataFrame({'P':['IG','HY','IG',np.nan,'HY'], 'M':['HY','HY','IG', np.nan,'IG'], 'F':['HY',np.nan,'HY', np.nan,'IG'],'D':['IG','IG','IG', 'HY','IG']})
    
    def count_winner(words):
        igc=0
        hyc=0
    
        for i in words:
            if(i=="IG"):
                igc+=1
            elif(i=="HY"):
                hyc+=1
        if(igc<=hyc):
            return("HY")
        else:
            return("IG")
    
    words=df_start.to_string(header=False, index=False, index_names=False).split('\n')
    
    words=[i.split("   ") for i in words]
    winners=[count_winner(i) for i in words]
    df_start["Result"]=winners
    
    将numpy导入为np
    作为pd进口熊猫
    df_start=pd.DataFrame({'P':['IG','HY','IG',np.nan,'HY'],'M':['HY','HY','IG','np.nan,'IG'],'F':['HY',np.nan','HY np.nan,'IG'],'D':['IG','IG'IG','HY','IG'IG','IG']
    def计数(大写):
    igc=0
    hyc=0
    对于我来说,用文字来说:
    如果(i=“IG”):
    igc+=1
    以利夫(i=“HY”):
    hyc+=1
    
    如果(igc一个可能的解决方案如下。也许它不是最优雅的,但它是有效的。 只有一个问题,如果在一行中你有所有的NaN,那么你将得到该行的“HY”

    import numpy as np
    import pandas as pd
    
    df_start = pd.DataFrame({'P':['IG','HY','IG',np.nan,'HY'], 'M':['HY','HY','IG', np.nan,'IG'], 'F':['HY',np.nan,'HY', np.nan,'IG'],'D':['IG','IG','IG', 'HY','IG']})
    
    def count_winner(words):
        igc=0
        hyc=0
    
        for i in words:
            if(i=="IG"):
                igc+=1
            elif(i=="HY"):
                hyc+=1
        if(igc<=hyc):
            return("HY")
        else:
            return("IG")
    
    words=df_start.to_string(header=False, index=False, index_names=False).split('\n')
    
    words=[i.split("   ") for i in words]
    winners=[count_winner(i) for i in words]
    df_start["Result"]=winners
    
    将numpy导入为np
    作为pd进口熊猫
    df_start=pd.DataFrame({'P':['IG','HY','IG',np.nan,'HY'],'M':['HY','HY','IG','np.nan,'IG'],'F':['HY',np.nan','HY np.nan,'IG'],'D':['IG','IG'IG','HY','IG'IG','IG']
    def计数(大写):
    igc=0
    hyc=0
    对于我来说,用文字来说:
    如果(i=“IG”):
    igc+=1
    以利夫(i=“HY”):
    hyc+=1
    如果(igc使用
    模式

    df_start['Result']= df_result.mode(1).iloc[:, 0]
    
    输出:

         P    M    F   D Result
    0   IG   HY   HY  IG     HY
    1   HY   HY  NaN  IG     HY
    2   IG   IG   HY  IG     IG
    3  NaN  NaN  NaN  HY     HY
    4   HY   IG   IG  IG     IG
    
    使用
    模式

    df_start['Result']= df_result.mode(1).iloc[:, 0]
    
    输出:

         P    M    F   D Result
    0   IG   HY   HY  IG     HY
    1   HY   HY  NaN  IG     HY
    2   IG   IG   HY  IG     IG
    3  NaN  NaN  NaN  HY     HY
    4   HY   IG   IG  IG     IG
    
    扩展溶液 如果您想计算数据帧中的每个uniques值,并确定哪一个最常出现,可以使用下面的代码

    细节 从给定的起始数据帧开始,NaN值将转换为字符串,以便对其进行比较。然后,在数据帧上使用查找唯一值的numpy方法。然后,使用这些值为每个唯一值创建一个新列,其中包含该行中该值的计数

    第二个for循环遍历新df中的行,查找每行的最大值,并将该列的名称与唯一值列表进行比较

    输入 输出: 欺骗 它不像@Scott的解决方案那样优雅,但如果您想对每个问题的出现次数做些什么,它确实增加了一些功能

    它也不能解决挑选
    HY
    而不是
    IG
    ,但如果不了解其背后的逻辑,就无法通过编程实现。

    扩展解决方案 如果您想计算数据帧中的每个uniques值,并确定哪一个最常出现,可以使用下面的代码

    细节 从给定的起始数据帧开始,NaN值将转换为字符串,以便对其进行比较。然后,在数据帧上使用查找唯一值的numpy方法。然后,使用这些值为每个唯一值创建一个新列,其中包含该行中该值的计数

    第二个for循环遍历新df中的行,查找每行的最大值,并将该列的名称与唯一值列表进行比较

    输入 输出: 欺骗 它不像@Scott的解决方案那样优雅,但如果您想对每个问题的出现次数做些什么,它确实增加了一些功能


    它也不能解决拾取
    HY
    而不是
    IG
    ,但是如果不知道背后的逻辑,就不能通过编程来完成。

    你能以文本格式而不是图像的形式发布数据帧吗?只需复制并粘贴在这里。大家好,欢迎这样做。请看一下,我发布了代码片段为什么返回
    HY
    IG
    ?那里的逻辑是什么?你能以文本格式而不是图像格式发布数据帧吗?只需复制并粘贴在这里。欢迎大家。请看一下,我发布了代码片段为什么返回
    HY
    而不是
    IG
    ?那里的逻辑是什么?