Pandas - 出现字符串时拆分数据并创建列
Posted
技术标签:
【中文标题】Pandas - 出现字符串时拆分数据并创建列【英文标题】:Pandas -Split data and create columns when string occurs 【发布时间】:2021-07-08 14:24:07 【问题描述】:我希望读取文本文件(见下文),然后仅为所有英语联赛创建列。因此,我将尝试执行类似“别名”为“England_”的操作,然后创建一个以别名作为标题的新列,然后在行中创建玩家名称。请注意,Alias 的第一次出现在文本文件中以“Aliases”的形式出现。
"-----------------------------------------------------------------------------------------------------------"
"- NEW TEAM -"
"-----------------------------------------------------------------------------------------------------------"
Europe Players
17/04/2019
07:59 p.m.
Aliases for England_Premier League
-------------------------------------------------------------------------------
Harry Kane
Mohamed Salah
Kevin De Bruyne
The command completed successfully.
Alias name England_Division 1
Comment Teams
Members
-------------------------------------------------------------------------------
Will Grigg
Jonson Clarke-Harris
Jerry Yates
Ivan Toney
Troy Parrott
The command completed successfully.
Alias name Spanish La Liga
Comment
Members
-------------------------------------------------------------------------------
Lionel Messi
Luis Suarez
Cristiano Ronaldo
Sergio Ramos
The command completed successfully.
Alias name England_Division 2
Comment
Members
-------------------------------------------------------------------------------
Eoin Doyle
Matt Watters
James Vughan
The command completed successfully.
这是我目前关于如何读取数据的代码
df = pd.read_csv(r'Desktop\SampleData.txt', sep='\n', header=None)
这给了我一个带有一列的 pandas DF。我对python相当陌生,所以我想知道如何获得以下结果?读取文件时应该使用分隔符吗?
England_Premier League | England_Division 1 | England_Division 2 |
---|---|---|
Harry Kane | Will Griggs | Eoin Doyle |
Mohamed Salah | Jonson Clarke-Harris | Matt Watters |
Kevin De Bruyne | Ivan Toney | James Vughan |
Troy Parrott |
【问题讨论】:
【参考方案1】:您可以使用re
模块来完成任务。例如:
import re
import pandas as pd
txt = """
"-----------------------------------------------------------------------------------------------------------"
"- NEW TEAM -"
"-----------------------------------------------------------------------------------------------------------"
Europe Players
17/04/2019
07:59 p.m.
Aliases for England_Premier League
-------------------------------------------------------------------------------
Harry Kane
Mohamed Salah
Kevin De Bruyne
The command completed successfully.
Alias name England_Division 1
Comment Teams
Members
-------------------------------------------------------------------------------
Will Grigg
Jonson Clarke-Harris
Jerry Yates
Ivan Toney
Troy Parrott
The command completed successfully.
Alias name Spanish La Liga
Comment
Members
-------------------------------------------------------------------------------
Lionel Messi
Luis Suarez
Cristiano Ronaldo
Sergio Ramos
The command completed successfully.
Alias name England_Division 2
Comment
Members
-------------------------------------------------------------------------------
Eoin Doyle
Matt Watters
James Vughan
The command completed successfully.
"""
r_competitions = re.compile(r"^Alias(?:(?:es for)| name)\s*(.*?)$", flags=re.M)
r_names = re.compile(r"^-+$\s*(.*?)\s*The command", flags=re.M | re.S)
dfs = []
for comp, names in zip(r_competitions.findall(txt), r_names.findall(txt)):
if not "England" in comp:
continue
data = []
for n in names.split("\n"):
data.append(comp: n)
dfs.append(pd.DataFrame(data))
print(pd.concat(dfs, axis=1).fillna(""))
打印:
England_Premier League England_Division 1 England_Division 2
0 Harry Kane Will Grigg Eoin Doyle
1 Mohamed Salah Jonson Clarke-Harris Matt Watters
2 Kevin De Bruyne Jerry Yates James Vughan
3 Ivan Toney
4 Troy Parrott
【讨论】:
很好的答案 @andrej 看起来很完美,如果您不介意,我只是有几个问题。您是否将原始文本文件称为“txt”?如果不是太麻烦的话,您是否可以输入一些简单的 cmets,以便我可以确切地看到每一行代码在做什么? @PythonBeginnertxt
只是变量名。您可以加载文件,例如 txt = open("your_file.txt", "r").read()
@AndrejKesely 谢谢。我现在必须对 For 循环进行一些研究,看看它是如何提取数据的。
@AndrejKesely 你介意带我了解一下使用的 r.compile 方法吗以上是关于Pandas - 出现字符串时拆分数据并创建列的主要内容,如果未能解决你的问题,请参考以下文章
Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列数据并添加到原数据中replace函数基于正则表达式替换字符串数据列中的匹配内容
将不同类型的 CSV 字符串加载到 Pandas 数据框中,拆分列,解析日期
Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类split函数基于指定分隔符拆分数据列的内容为列表设置参数n控制拆分的次数(此处为1则拆分一次,列表长度为2
Pandas使用str属性获取数据列的字符串方法类split函数基于指定分隔符拆分数据列的内容为列表设置参数n控制拆分的次数设置expand参数将拆分结果列表内容转化为多列dataframe
Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列dataframe(不设置参数n则列表长度不同较短的列表会出现缺失值)
Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类split函数基于指定分隔符拆分数据列的内容为列表设置参数n控制拆分的次数获取所有列表中指定位置的元素内容