pandas Python:基于多个条件语句更改列中的值

cuxqih21  于 2023-02-02  发布在  Python
关注(0)|答案(2)|浏览(164)

我有一个 Dataframe 如下:
| 团队|姓名|职位|字段位置|
| - ------|- ------|- ------|- ------|
| A类|约翰|撞针|正面|
| A类|卡尔|辩护人|背|
| A类|亚历克斯|灌装|无|
| A类|罗恩|中场|中|
| | | | |
| 乙|泰勒|撞针|正面|
| 乙|乍得|辩护人|背|
| 乙|居伊|守门员|背|
| 乙|汤姆|灌装|无|
| | | | |
| C级|詹姆斯|灌装|无|
| C级|卢卡斯|辩护人|背|
| C级|本|中场|中|
| C级|挪亚|守门员|背|
我想根据位置列将FieldPosition列中的"None"值更改为"Front"、"Middle"或"Back"。
每支球队在场上位置栏中总是有1个前锋,2个后卫和1个中场。前锋总是在前锋,后卫总是在后卫,中场总是在中场。
例如:A组中的填充位置将具有"后"字段B组中的填充位置将具有"中"字段C组中的填充位置将具有"前"字段位置
我猜创建一个带有循环和if语句的函数可以解决这个问题,因为有超过20个团队。我该怎么做呢?
最终答案应如下所示:
| 团队|姓名|职位|字段位置|
| - ------|- ------|- ------|- ------|
| A类|约翰|撞针|正面|
| A类|卡尔|辩护人|背|
| A类|亚历克斯|灌装|* 后退 |
| A类|罗恩|中场|中|
| | | | |
| 乙|泰勒|撞针|正面|
| 乙|乍得|辩护人|背|
| 乙|居伊|守门员|背|
| 乙|汤姆|灌装|
中间 |
| | | | |
| C级|詹姆斯|灌装|
前面 *|
| C级|卢卡斯|辩护人|背|
| C级|本|中场|中|
| C级|挪亚|守门员|背|

ddrv8njm

ddrv8njm1#

Map固定位置后使用Counter差值:

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))

输出:

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
gev0vcfq

gev0vcfq2#

我们可以编写一个函数,从所需的集合中减去FieldPositions,然后为每个Team填充缺失的一个:

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'])

相关问题