Pandas: 拆分 and/or 更新列,基于不一致的数据?
Pandas: Split and/or update columns, based on inconsistent data?
所以我有一个包含棒球队名称的列,我想将它分成 2 个新列,分别包含城市名称和球队名称。
Team
New York Giants
Atlanta Braves
Chicago Cubs
Chicago White Sox
我想得到这样的东西:
Team
City
Franchise
New York Giants
New York
Giants
Atlanta Braves
Atlanta
Braves
Chicago Cubs
Chicago
Cubs
Chicago White Sox
Chicago
White Sox
到目前为止我尝试了什么?
- 使用
split
和 rsplit
--> 它完成了工作,但无法统一它。
- 计算
df['cnt'] = df.asc.apply(lambda x: len(str(x).split(' ')))
得到字符串的数量,所以我知道我有什么样的情况
有 3 种不同的情况:
- 标准一(例如亚特兰大勇士队)
- 有 2 个字符串的城市(例如纽约巨人队)
- 带有 2 个字符串的球队名称(例如 Chicago White Sox)
我想做什么?
- 根据条件拆分 (
if cnt=2 then split on 1st occurence
)。找不到这个的语法,这将如何进行?
- 根据名称更新(例如
if ['Col_name'].str.contains("York" or "Angeles") then split on 2nd occurence
。此外,找不到可用的语法,例如?
解决这个问题的好方法是什么?
谢谢!
使用:
#part of cities with space
cities = ['York','Angeles']
#test rows
m = df['Team'].str.contains('|'.join(cities))
#first split by first space to 2 new columns
df[['City','Franchise']] = df['Team'].str.split(n=1, expand=True)
#split by second space only filtered rows
s = df.loc[m, 'Team'].str.split(n=2)
#update values
df.update(pd.concat([s.str[:2].str.join(' '), s.str[2]], axis=1, ignore_index=True).set_axis(['City','Franchise'], axis=1))
print (df)
Team City Franchise
0 New York Giants New York Giants
1 Atlanta Braves Atlanta Braves
2 Chicago Cubs Chicago Cubs
3 Chicago White Sox Chicago White Sox
所以我有一个包含棒球队名称的列,我想将它分成 2 个新列,分别包含城市名称和球队名称。
Team |
---|
New York Giants |
Atlanta Braves |
Chicago Cubs |
Chicago White Sox |
我想得到这样的东西:
Team | City | Franchise |
---|---|---|
New York Giants | New York | Giants |
Atlanta Braves | Atlanta | Braves |
Chicago Cubs | Chicago | Cubs |
Chicago White Sox | Chicago | White Sox |
到目前为止我尝试了什么?
- 使用
split
和rsplit
--> 它完成了工作,但无法统一它。 - 计算
df['cnt'] = df.asc.apply(lambda x: len(str(x).split(' ')))
得到字符串的数量,所以我知道我有什么样的情况
有 3 种不同的情况:
- 标准一(例如亚特兰大勇士队)
- 有 2 个字符串的城市(例如纽约巨人队)
- 带有 2 个字符串的球队名称(例如 Chicago White Sox)
我想做什么?
- 根据条件拆分 (
if cnt=2 then split on 1st occurence
)。找不到这个的语法,这将如何进行? - 根据名称更新(例如
if ['Col_name'].str.contains("York" or "Angeles") then split on 2nd occurence
。此外,找不到可用的语法,例如?
解决这个问题的好方法是什么?
谢谢!
使用:
#part of cities with space
cities = ['York','Angeles']
#test rows
m = df['Team'].str.contains('|'.join(cities))
#first split by first space to 2 new columns
df[['City','Franchise']] = df['Team'].str.split(n=1, expand=True)
#split by second space only filtered rows
s = df.loc[m, 'Team'].str.split(n=2)
#update values
df.update(pd.concat([s.str[:2].str.join(' '), s.str[2]], axis=1, ignore_index=True).set_axis(['City','Franchise'], axis=1))
print (df)
Team City Franchise
0 New York Giants New York Giants
1 Atlanta Braves Atlanta Braves
2 Chicago Cubs Chicago Cubs
3 Chicago White Sox Chicago White Sox