我有一个数据框,如下所示。
我想创建一个名为Result
的新列
应基于以下规则创建结果。
D,F,M,P
列返回最显示的值IG
和HY
之间有平局,请返回HY
。NaN
视为值。我得到的数据框如下:
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']}
答案 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
的问题,但是如果不了解其背后的逻辑,就无法通过编程方式完成。