Pandas,在尝试拆分数据时,得到 "TypeError: 'list'对象不可调用"。

问题描述 投票:0回答:1

有一些数据,看起来像这样。

Name        Best Rating
Player1     97.1% (FS)
Player2     96.3% (CB)
Player3     95.5% (DR)
Player4     95.4% (DL)

我想把这列数据拆开,使它看起来像这样

Name        Max Rating        Best Position
Player1     97.1              FS
Player2     96.3              CB
Player3     95.5              DR
Player4     95.4              DL

我的代码是这样的

import pandas as pd
df = pd.read_csv('prem1.csv', sep = ";", encoding = 'unicode_escape')

cols = ['Max Rating', 'Best Position']   
df['Best Rating'].str.split('% ', expand=True).rename(columns = cols)
df.head()

当我尝试这段代码时,我得到以下错误信息。

TypeError: 'list' object is not callable

以下是对错误代码的更详细解释(截图)。https:/imgur.comvbGswh9

有什么想法,这里出了什么问题,为什么我不能分割列?

python pandas
1个回答
1
投票

最简单的分割方法是这样的。

In [447]: df['Max Rating'], df['Best Position'] = df['Best Rating'].str.split(' ', 1).str

In [450]: df['Max Rating'] = df['Max Rating'].str.replace('%','')

In [452]: df.drop('Best Rating', 1, inplace=True)       

In [456]: df['Best Position'] = df['Best Position'].str.replace(r'[\(\)\d]+', '')                                                                                                                           

In [457]: df                                                                                                                                                                                                
Out[457]: 
      Name Max Rating Best Position
0  Player1       97.1            FS
1  Player2       96.3            CB
2  Player3       95.5            DR
3  Player4       95.4            DL

0
投票

pandas.DataFrame.rename 需要一个callable或mapper来实现。columns 参数。 通常情况下,一个 dict 就可以了。

试试这个。

df['Best Rating'].str.split('% ', expand=True).rename(columns = {k: v for k, v in enumerate(col)})

或者如果你想更明确一点

cols = {0: 'Max Rating', 1: 'Best Position'}
df['Best Rating'].str.split('% ', expand=True).rename(columns = cols)

结果:

  Max Rating Best Position
0       97.1          (FS)
1       96.3          (CB)
2       95.5          (DR)
3       95.4          (DL)

把它放在一起

>>> df.drop('Best Rating', axis=1).join(df['Best Rating'].str.split('% ', expand=True).rename(columns = {k: v for k, v in enumerate(['Max Rating', 'Best Position'])}))
      Name Max Rating Best Position
0  Player1       97.1          (FS)
1  Player2       96.3          (CB)
2  Player3       95.5          (DR)
3  Player4       95.4          (DL)
© www.soinside.com 2019 - 2024. All rights reserved.