如何在已抓取的 Pandas 数据框中的所有列上使用 `str.replace()` 方法?

How to use `str.replace()` method on all columns in a scraped Pandas dataframe?

我是 Python/Pandas 数据分析的初学者。我正在尝试从维基百科关于字母频率的文章中导入(/抓取)table,清理它,并将其转换为数据框。

这是我用来将 table 转换为名为 letter_freq_all 的数据框的代码:

import pandas as pd
import numpy as np

letter_freq_all = pd.read_html('http://en.wikipedia.org/wiki/Letter_frequency', header=0)[4]
letter_freq_all

我想清理数据并正确格式化以进行数据分析:

这是我试过的代码:

letter_freq_all2 = [str.replace(i,'%','') for i in letter_freq_all]

我没有得到一个没有任何 % 符号的新数据框,而是得到了 letter_freq_all 中所有列的列表:

['Letter','French [14]','German [15]','Spanish [16]','Portuguese [17]','Esperanto  [18]','Italian[19]','Turkish[20]','Swedish[21]','Polish[22]','Dutch [23]','Danish[24]','Icelandic[25]','Finnish[26]','Czech']

然后我尝试去掉一栏中的 % 符号:

letter_freq_all3 = [str.replace(i,'%','') for i in letter_freq_all['Italian[19]']]**

当我这样做时,str.replace 方法有点奏效了——我得到了一个没有任何 % 标志的列表(我期待得到一个系列)。

那么,如何去掉数据框 letter_freq_all 中所有列中的 % 符号?另外,我怎样才能去掉所有列中的所有括号和额外的白色 space 填充?我猜我可能必须使用 .split() 方法

对于数据分析,使用 float 而不是 string 条目是有意义的。所以你可以写一个函数来尝试转换每个条目:

def f(s):
    """ convert string to float if possible """
    s = s.strip()  # remove spaces at beginning and end of string
    if s.endswith('%'):  # remove %, if exists
        s = s[:-1]
    try:
        return float(s)
    except ValueError: # converting did not work
        return s  # return original string

lf2 = letter_freq_all.applymap(f)  # convert all entries 

认为这行得通。我使用 panda 的 broadcasting capabilities 一次替换 1 列(实际上是几列)中的值。

# Ignore first col with letters in it.
cols = letter_freq_all.columns[1:]

# Replace the columns `cols` in the DF
letter_freq_all[cols] = (
    letter_freq_all[cols]
    # Replace things that aren't numbers and change any empty entries to nan
    # (to allow type conversion)
    .replace({r'[^0-9\.]': '', '': np.nan}, regex=True)
    # Change to float and convert from %s
    .astype(np.float64) / 100
)

letter_freq_all.head()


 Letter  French [14]  German [15]  Spanish [16]  Portuguese [17]  ...
0      a      0.07636      0.06516       0.11525          0.14634   
1      b      0.00901      0.01886       0.02215          0.01043   
2      c      0.03260      0.02732       0.04019          0.03882   
3      d      0.03669      0.05076       0.05510          0.04992   
4      e      0.14715      0.16396       0.12681          0.11570 

实现目标的最简洁方法是使用带正则表达式的 str.replace() 方法:

1) 重命名列:

letter_freq_all.columns = pd.Series(letter_freq_all.columns).str.replace('\[\d+\]', '').str.strip()

2) 替换星号和百分号并转换为小数:

letter_freq_all.apply(lambda x: x.str.replace('[%*]', '').astype(float)/100, axis=1)

在这种情况下,apply() 对每一列执行 str.replace() 方法。

在此处了解有关正则表达式元字符的更多信息:

https://www.hscripts.com/tutorials/regular-expression/metacharacter-list.php