当前位置: 首页 > 知识库问答 >
问题:

在熊猫数据框中规范化列

有宏峻
2023-03-14

我有一个熊猫数据框,它有语料库的术语频率,术语为行,年份为列,就像这样:

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

我希望能够通过将每个单词的值除以给定年份的总单词数来标准化它们——有些年份包含两倍多的文本,所以我试图按年缩放(像谷歌图书一样)。我已经看了如何缩放单个列的例子,克里斯·阿尔邦和我在SO上看到了缩放所有列的例子,但是每次我试图将这个数据框转换为一个数组来缩放时,事情都会窒息列这个词不是数字。(我尝试将术语列设置为索引,但不太顺利。)我可以想象用for循环来实现这一点的方法,但是我读到的几乎每一个干净的熊猫代码的例子都说不要使用循环,因为熊猫有一种完成一切的方法。

我想说的是:

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

就这样了。

共有2个答案

胡向阳
2023-03-14

尝试:

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
柳涵映
2023-03-14

试试这个:

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']
)

退换商品

      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
 类似资料:
  • 问题内容: 我有一个熊猫数据框。看起来像这样: 但有100行和100列。 我想展平它,使其看起来像这样: 最有效的方法是什么? 谢谢, 插口 问题答案: 选项1 无法100%确定效率,但最简单的方法是使用 。 选项2 另一个简单的选项 - 要么,

  • 问题内容: 抱歉,是否曾有人问过这个问题,但我进行了广泛调查,没有结果。 我想创建一个新列,该列根据某些规则映射的多个值,例如a = [1,2,3]为1,a = [4,5,6,7]为2,a = [8 ,9,10]为3。一对一映射对我来说很清楚,但是如果我想按值列表或范围进行映射怎么办? 我遵循这些原则… 问题答案: 有几种选择。 熊猫通过/ NumPy通过 NumPy通过 的元素是布尔级数,因此对

  • 问题内容: 我正在寻找一种方法来反向旋转数据框。据我所知,pandas提供了一种pivot或pivot_table方法将EAV df转换为“普通”方法。但是,还有一种方法可以做逆运算吗? 所以给定数据框: 我想将其转换为(EAV模型): 这样做最有效的方法是什么? 问题答案: 假设是索引,将执行以下操作: 如果不是索引,请像这样设置:

  • 我想使用两列作为行ID,同时计算基于时间的分组。请看下图: 转化成这样: 正在发生的是,X在时间10发生了0次,但在15和23发生了1次。 Y在10点钟发生了3次,但在15和23没有。等等。

  • 问题内容: 我有一个从以下代码获得的数据框,但无法将索引转换为dd / mm / yyyy 这是结果 我已经在stackoverflow上搜索了其他几个不同的变体,但是我找不到适合的组合。 它仍然打印出as 问题答案: 如果需要则是个问题,因为是in的默认显示格式。 如果需要通过索引: 不幸的是,这不起作用-docs:

  • 问题内容: 我有两个看起来像这样的数据框: 现在,如果我利用pandas .isin函数,我可以做一些漂亮的事情 列和from存在于while中不 我的问题是:是否有人知道为df_2中但不存在于df_1中的列返回列标签的方法 像这样的东西 先感谢您! 问题答案: 熊猫索引对象具有类似集合的属性,因此您可以直接执行以下操作: 您还可以使用运算符来计算交集,并集和对称差: 过去存在差异的运算符,现已弃