繁体   English   中英

Python:根据多个条件语句更改列中的值

[英]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'])
问题未解决?试试搜索: Python:根据多个条件语句更改列中的值
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM