标准化 pandas 数据框中的列

Normalize columns in pandas dataframe

我有一个 pandas 数据框,其中包含语料库的术语频率,术语作为行,年份作为列,如下所示:

|       | term    |   2002 |   2003 |   2004 |   2005 |
|------:|:--------|-------:|-------:|-------:|-------:|
|  3708 | climate |      1 |     10 |      1 |     14 |
|  8518 | global  |     12 |     11 |      2 |     12 |
| 13276 | nuclear |     10 |      1 |      0 |      4 |

我希望能够通过将每个单词的值除以给定年份的单词总数来标准化这些值——有些年份包含的文本数量是原来的两倍,所以我尝试按年份缩放(比如Google 书籍)。我已经查看了如何缩放单个列的示例,la Chris Albon,我已经在 SO 上看到了缩放 all 列的示例,但每次我尝试转换它dataframe 到 array 以缩放,因为术语列不是数字这一事实令人窒息。 (我尝试将术语列设置为索引,但效果不佳。)我可以想象一种使用 for 循环执行此操作的方法,但几乎每个干净的示例 pandas 我读过的代码说不要使用 for 循环,因为有一个 pandas 做事的方式,好吧,一切。

我想要的是某种表达方式:

for these columns [the years]:
    divide each row by the sum of all rows

就是这样。

试试这个:

import pandas as pd

df = pd.DataFrame(
    columns=['term', '2002', '2003', '2004', '2005'],
    data=[['climate', 1, 10, 1, 14],
          ['global', 12, 11, 2, 12],
          ['nuclear', 10, 1, 0, 4], ])
normalized = df.select_dtypes('int').apply(lambda x: x / sum(x))
df = df.merge(
    right=normalized,
    left_index=True,
    right_index=True,
    suffixes=['', '_norm']
)

Returns

      term  2002  2003  2004  2005  2002_norm  2003_norm  2004_norm  2005_norm
0  climate     1    10     1    14   0.043478   0.454545   0.333333   0.466667
1   global    12    11     2    12   0.521739   0.500000   0.666667   0.400000
2  nuclear    10     1     0     4   0.434783   0.045455   0.000000   0.133333

尝试:

In [5]: %paste                                                                                                                                                                                                                                                                       
cols = ['2002', '2003', '2004', '2005']
df[cols] = df[cols] / df[cols].sum()

## -- End pasted text --

In [6]: df                                                                                                                                                                                                                                                                           
Out[6]: 
      term      2002      2003      2004      2005
0  climate  0.043478  0.454545  0.333333  0.466667
1   global  0.521739  0.500000  0.666667  0.400000
2  nuclear  0.434783  0.045455  0.000000  0.133333