3 回答
TA贡献1851条经验 获得超3个赞
如果只有一个在 中使用第一列,则可以DataFrame.mode
通过 来使用和计算非缺失值:DataFrame.count
draw
numpy.where
df1 = df.mode(axis=1)
print (df1)
0 1
0 a NaN
1 b NaN
2 a b
df['winner_columns'] = np.where(df1.count(axis=1).eq(1), df1[0], 'draw')
print (df)
vote_1 vote_2 vote_3 vote_4 winner_columns
0 a a a b a
1 b b a b b
2 b a a b draw
您的解决方案可能会改变:
def winner(x):
s = x.value_counts()
a = s['a']
b = s['b']
if a > b:
y = 'a'
elif a < b:
y = 'b'
else:
y = 'draw'
return y
df['winner_columns'] = df.apply(winner,axis=1)
print (df)
vote_1 vote_2 vote_3 vote_4 winner_columns
0 a a a b a
1 b b a b b
2 b a a b draw
TA贡献1906条经验 获得超3个赞
第一个问题是您的 DataFrame 有时包含一个字母后跟一个点。
因此,要单独查找,'a'或者'b'您必须将这些点替换为空字符串,例如:
df.replace('\.', '', regex=True)
另一个问题(在您的情况下没有出现)是,一行只能包含or 'a','b'并且您的代码应该能够抵抗 此类源行中缺少特定结果的情况。
为了使您的函数能够抵抗这种情况,请将其更改为:
def winner(row):
vc = row.value_counts()
a = vc.get('a', 0)
b = vc.get('b', 0)
if a > b: return 'a'
elif a < b: return 'b'
else: return 'draw'
然后您可以应用您的函数,但如果您想将其应用到每一 行(而不是列),您应该传递axis=1。
因此,总而言之,将代码更改为:
df['winner_columns'] = df.replace('\.', '', regex=True).apply(winner, axis=1)
对于您的示例数据,结果是:
vote_1 vote_2 vote_3 vote_4 winner_columns
0 a. a. a. b a
1 b. b. a b b
2 b. a. a b draw
TA贡献1824条经验 获得超5个赞
您可以使用.sum()来计算选票,然后将获胜者保存在列表中,最后添加到数据框中。
numpy_votes = dataframe_votes.to_numpy()
winner_columns = []
for i in numpy_votes:
if np.sum(i == 'a') < np.sum(i == 'b'):
winner_columns.append('b')
elif np.sum(i == 'a') > np.sum(i == 'b'):
winner_columns.append('a')
else:
winner_columns.append('draw')
dataframe_votes['winner_columns'] = winner_columns
根据这个答案,使用 .sum() 方法是计算数组内元素的最快方法。
输出:
vote_1 vote_2 vote_3 vote_4 winner_columns
0 a a a b a
1 b b a b b
2 b a a b draw
添加回答
举报