Python将列字符串值拆分为单独的列

2024-05-16 21:37:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧: enter image description here

阵容栏的格式为“QB亚伦·罗杰斯、RB乔什·雅各布斯、RB波士顿斯科特、FLEX安东尼奥·吉布森、WR达凡特·亚当斯、WR亚当·蒂伦、WR艾伦·拉扎德、TE马克·安德鲁斯、DST爱国者”

我需要根据位置将列表列拆分为单独的列。 最终数据帧将如下所示:

enter image description here

我尝试过这一行代码:

df = pd.DataFrame(df.Lineup.str.split(' ').tolist(), columns = ['DST','FLEX','QB','RB1','RB2','TE','WR1','WR2','WR3'])

但是我犯了一个错误


Tags: 数据代码dataframedf列表格式wrdst
2条回答

实际上,将Lineup列的格式设置为键和内容之间的差异将非常有用。在角色之间使用逗号,或者其他一些可以帮助简化解析的东西

我确信有一种更优雅的方法来解决这类问题,但是,我设置了一个用指示符['DST','FLEX','QB','RB','TE','WR']键入的字典。在下面的代码中,我假设您的数据总是以3和最后一个2组的形式存在。如果这是一个不正确的假设,您需要更正程序的该部分

import pandas as pd

df = pd.DataFrame({
    "Rank": [1],
    "EntryId": ["2210633437"],
    "EntryName": ["180DegreesMiami (2/3)"],
    "TimeRemaining": [0],
    "Points": [214.06],
    "Lineup": ["QB Aaron Rodgers "
               "RB Josh Jacobs "
               "RB Boston Scott "
               "FLEX Antonio Gibson "
               "WR Davante Adams "
               "WR Adam Thielen "
               "WR Allen Lazard "
               "TE Mark Andrews "
               "DST Patriots"],
    "WeekSeason": ["12020"],
    "Player": ["Boston Scott"],
    "Roster Position": ["RB"],
    "FPTS": [7.4]
})


def process_column(s):
    splits = s.split(' ')
    d = {}
    for key, *rest in [splits[i:i + 3] for i in range(0, len(splits), 3)]:
        d.setdefault(key, []).append(' '.join(rest))

    d2 = {}
    for key, values in d.items():
        if len(values) > 1:
            for i, value in enumerate(values):
                d2[f'{key}{i + 1}'] = value
        else:
            d2[key] = values[0]
    return pd.Series(d2)


df = pd.merge(df, df.Lineup.apply(process_column), left_index=True, right_index=True).drop(columns=['Lineup'])

该程序产生以下输出:

^{tb1}$

可以根据需要重新排列列

通过在位置上拆分,可以使用regex提取名称。然后通过压缩位置和名称创建一个dictionary。结果可以转换为数据帧,然后与现有数据帧连接。要使用示例字符串,请执行以下操作:

import re
import pandas as pd

def get_names(text):
    names = [i.strip() for i in re.split('QB |RB |FLEX |WR |TE |DST ', text) if i]
    positions = ['QB', 'RB1', 'RB2', 'FLEX', 'WR1', 'WR2', 'WR3', 'TE', 'DST']
    return dict(zip(positions, names))

df = pd.DataFrame(['QB Aaron Rodgers RB Josh Jacobs RB Boston Scott FLEX Antonio Gibson WR Davante Adams WR Adam Thielen WR Allen Lazard TE Mark Andrews DST Patriots'], columns=['Lineup'])
d = df['Lineup'].apply(get_names)

df = pd.concat([df, pd.DataFrame(d.tolist())], axis = 1)

输出:

^{tb1}$

相关问题 更多 >