Python 将函数应用于数据帧中的每一行
我试图为数据帧中的每一行应用以下函数。数据框如下所示:Python 将函数应用于数据帧中的每一行,python,pandas,function,Python,Pandas,Function,我试图为数据帧中的每一行应用以下函数。数据框如下所示: vote_1 vote_2 vote_3 vote_4 a a a b b b a b b a a b vote_1 vote_2 vote_3 vote_4 winner_columns a a a b a b b
vote_1 vote_2 vote_3 vote_4
a a a b
b b a b
b a a b
vote_1 vote_2 vote_3 vote_4 winner_columns
a a a b a
b b a b b
b a a b draw
我尝试生成第四列,将其他列的“投票数”相加,并生成赢家,如下所示:
vote_1 vote_2 vote_3 vote_4
a a a b
b b a b
b a a b
vote_1 vote_2 vote_3 vote_4 winner_columns
a a a b a
b b a b b
b a a b draw
我目前已尝试:
def winner(x):
a = new_df.iloc[x].value_counts()['a']
b = new_df.iloc[x].value_counts()['b']
if a > b:
y = 'a'
elif a < b:
y = 'b'
else:
y = 'draw'
return y
df['winner_columns'].apply(winner)
def赢家(x):
a=新的[u df.iloc[x]。值[u counts()['a']
b=new_df.iloc[x]。值_计数()['b']
如果a>b:
y='a'
如果a
但是,整个列都被绘图填充。我假设这与我构建函数的方式有关,但无法计算出您可以使用什么,如果只有一个使用第一列elsedraw
,则可以通过以下方式计算未缺失的值:
您的解决方案是可能的更改:
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
def赢家(x):
s=x.值_计数()
a=s['a']
b=s['b']
如果a>b:
y='a'
如果a
如果只有一个用户使用第一列else在以下位置绘制,则可以使用和计数未缺失的值:
您的解决方案是可能的更改:
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
def赢家(x):
s=x.值_计数()
a=s['a']
b=s['b']
如果a>b:
y='a'
如果a
第一个问题是数据帧有时包含
后跟一个点的字母
因此,要单独查找'a'
或'b'
,必须替换这些点
对于空字符串,类似于:
df.replace('\.', '', regex=True)
另一个在你的案例中没有出现的问题是,一行可以
仅包含'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'
对于示例数据,结果是:
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
第一个问题是数据帧有时包含
后跟一个点的字母
因此,要单独查找'a'
或'b'
,必须替换这些点
对于空字符串,类似于:
df.replace('\.', '', regex=True)
另一个在你的案例中没有出现的问题是,一行可以
仅包含'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'
对于示例数据,结果是:
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
您可以使用统计选票,然后将获胜者保存在列表中,最后添加到数据框中
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
您可以使用统计选票,然后将获胜者保存在列表中,最后添加到数据框中
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
您是否尝试过在df.apply()
方法中调整axis=
参数?似乎是的重复?您是否尝试过在df.apply()
方法中调整axis=
参数?似乎是的重复?如果赢家有两个以上的选项,您能否帮助我调整此参数?例如,如果有4个或5个潜在的投票选择?如果有2个以上的选择作为赢家,你能帮我调整吗?例如,如果有4个或5个潜在的投票选择?