[英]Python : Change values in a column based on multiple conditional statements
提示:本站为国内最大中英文翻译问答网站,提供中英文对照查看,鼠标放在中文字句上可显示英文原文。
我有一个 dataframe 如下:
团队 | 姓名 | Position | 字段位置 |
---|---|---|---|
A | 约翰 | 前锋 | 正面 |
A | 卡尔 | 后卫 | 后退 |
A | 亚历克斯 | 充满 | 没有任何 |
A | 罗恩 | 中场 | 中间 |
乙 | 泰勒 | 前锋 | 正面 |
乙 | 乍得 | 后卫 | 后退 |
乙 | 家伙 | 守门员 | 后退 |
乙 | 汤姆 | 充满 | 没有任何 |
C | 詹姆士 | 充满 | 没有任何 |
C | 卢卡斯 | 后卫 | 后退 |
C | 本 | 中场 | 中间 |
C | 诺亚 | 守门员 | 后退 |
我想根据 Position 列将 FieldPosition 列中的“无”值更改为“前”、“中”或“后”。
每支球队的 FieldPosition 列始终有 1 个前锋、2 个后卫和 1 个中锋。 前锋永远是前锋,后卫永远是后卫,中场永远是中锋。
例如: A 队中的填充 position 将具有“后”FieldPosition B 队中的填充 position 将具有“中间”FieldPosition C 中的填充 position 将具有“前”FieldPosition
我猜测创建一个带有循环和 if 语句的 function 将解决这个问题,因为有超过 20 个团队。 我怎样才能做到这一点?
最终答案应该如下:
团队 | 姓名 | Position | 字段位置 |
---|---|---|---|
A | 约翰 | 前锋 | 正面 |
A | 卡尔 | 后卫 | 后退 |
A | 亚历克斯 | 充满 | 后退 |
A | 罗恩 | 中场 | 中间 |
乙 | 泰勒 | 前锋 | 正面 |
乙 | 乍得 | 后卫 | 后退 |
乙 | 家伙 | 守门员 | 后退 |
乙 | 汤姆 | 充满 | 中间 |
C | 詹姆士 | 充满 | 正面 |
C | 卢卡斯 | 后卫 | 后退 |
C | 本 | 中场 | 中间 |
C | 诺亚 | 守门员 | 后退 |
在映射固定位置后使用Counter
difference:
from collections import Counter
ref = Counter({'Front': 1, 'Middle': 1, 'Back': 2})
positions = {'Striker': 'Front', 'Defender': 'Back', 'Midfielder': 'Middle'}
df['FieldPosition'] = df['Position'].map(positions).fillna(df['FieldPosition'].replace({'None': float('nan')}))
def guess_missing(x):
c = ref-Counter(x)
if len(c) == 1:
return next(iter(c))
df['FieldPosition'] = df['FieldPosition'].fillna(df.groupby('Team')['FieldPosition'].transform(guess_missing))
Output:
Team Name Position FieldPosition
0 A John Striker Front
1 A Carl Defender Back
2 A Alex Fill Back
3 A Ron Midfielder Middle
4 B Tyler Striker Front
5 B Chad Defender Back
6 B Guy Goalkeeper Back
7 B Tom Fill Middle
8 C James Fill Front
9 C Lucas Defender Back
10 C Ben Midfielder Middle
11 C Noah Goalkeeper Back
我们可以编写一个 function 从所需的集合中减去 FieldPositions 并为每个团队填充缺失的一个:
import pandas as pd
import numpy as np
from io import StringIO
from collections import Counter
csv = """
Team Name Position FieldPosition
A John Striker Front
A Carl Defender Back
A Alex Fill None
A Ron Midfielder Middle
B Tyler Striker Front
B Chad Defender Back
B Guy Goalkeeper Back
B Tom Fill None
C James Fill None
C Lucas Defender Back
C Ben Midfielder Middle
C Noah Goalkeeper Back"""
df = pd.read_csv(StringIO(csv), sep = '\t')
correct_values = ['Front','Back','Back','Middle']
def fill_none(lst):
c = Counter(correct_values)-Counter(lst)-Counter(['None'])
return list(c.elements())[0]
df['FieldPosition'] = np.where(df['FieldPosition'] == 'None',
df.groupby('Team').FieldPosition.transform(fill_none),
df['FieldPosition'])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.