根据其他列的内容创建一个新列

时间:2019-08-19 15:24:33

标签: python pandas

我有一个数据框,如下所示。

enter image description here

我想创建一个名为Result的新列

应基于以下规则创建结果。

  1. 根据第D,F,M,P列返回最显示的值
  2. 如果IGHY之间有平局,请返回HY
  3. 请勿将NaN视为值。

我得到的数据框如下:

enter image description here

 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']})

 df_result = pd.DataFrame({'Result':['HY','HY','IG', 'HY','IG'],'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']}

3 个答案:

答案 0 :(得分:2)

使用mode

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

答案 1 :(得分:0)

可能的解决方法如下。也许它不是最优雅的,但可以。 只有一个问题,如果一行中有ALL 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

答案 2 :(得分:0)

扩展解决方案

如果要计算数据框中的每个唯一值并确定最常出现的唯一值,则可以使用下面的代码。

详细信息

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

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

输入

import pandas as pd
import numpy as np

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']})
df = df_start

df = df.fillna("NaN")
values = np.unique(df[df.columns].values)

# Create new df for storing counts
new_df = pd.DataFrame()

# Count occurence of each value 
for value in values:
    for index, row in df.iterrows():
        new_df.at[index,value] = int(row.values.tolist().count(value))

# Find max for each value
for index, row in new_df.iterrows():
    new_df.at[index,'Max'] = max(row.values.tolist())
    for value in values:
        if new_df.at[index,'Max'] == new_df.at[index,value]:
            new_df.at[index,'Result'] = value

# Combine the data frames
df = pd.concat([df,new_df],axis=1)

输出:

    D    F    M    P   HY   IG  NaN  Max Result
0  IG   HY   HY   IG  2.0  2.0  0.0  2.0     IG
1  IG  NaN   HY   HY  2.0  1.0  1.0  2.0     HY
2  IG   HY   IG   IG  1.0  3.0  0.0  3.0     IG
3  HY  NaN  NaN  NaN  1.0  0.0  3.0  3.0    NaN
4  IG   IG   IG   HY  1.0  3.0  0.0  3.0     IG

缺点

它不像@Scott的解决方案那样优雅,但是如果您想对每个事件的出现次数做一些事情,它确实增加了一些功能。

它也不能解决在HY上选择IG的问题,但是如果不了解其背后的逻辑,就无法通过编程方式完成。