标准化 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
我有一个 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