标签:Python与Excel,pandas
在Excel中,我们可以通过先在单元格中编写公式,然后向下拖动列来创建计算列。在PowerQuery中,还可以添加“自定义列”并输入公式。在Python中,我们创建计算列的方式与PQ中非常相似,创建一列,计算将应用于这整个列,而不是像Excel中的“下拉”方法那样逐行进行。要创建计算列,步骤一般是:先创建列,然后为其指定计算。
准备演示用的数据框架
我们将从百度百科获取世界500公司名称和相关信息:
https://baike.baidu.com/item/%E4%B8%96%E7%95%8C500%E5%BC%BA/640042?fr=aladdin
import pandas as pd
df = pd.read_html('https://baike.baidu.com/item/%E4%B8%96%E7%95%8C500%E5%BC%BA/640042?fr=aladdin')[1]
下面是获取的表。

图1
在pandas中创建计算列的关键
如果有Excel和VBA的使用背景,那么一定很想遍历列中所有内容,这意味着我们在一个单元格中创建公式,然后向下拖动。然而,这不是Python的工作方式。其正确的计算方法类似于Power Query,对整个列执行操作,而不是循环每一行。基本上,我们不会在pandas中循环一列,而是对整个列执行操作。这就是所谓的“矢量化”操作。Power Query似乎可以做到这一点,但效率不如Python。
panda数据框架中的字符串操作
让我们看看下面的示例,从公司名称列中拆分中文和英文名称。df[‘公司名称’]是一个pandas系列,有点像Excel或Power Query中的列。df[‘公司名称’].str是列中的字符串值,这意味着我们可以直接对其使用字符串方法。通过这种方式进行操作,我们不会一行一行地循环遍历。

图2
数据框架中的日期时间操作
为便于演示,我们使用下面网站中的数据:
http://fund.eastmoney.com/company/default.html

图3
我们要计算基金公司成立的年数,可以使用“成立时间”列来推导这个公式。首先,我们需要知道该列中存储的数据类型,这可以通过检查列中的第一项来找到答案。

图4
很明显,该列包含的是字符串数据。
将该列转换为datetime对象,这是Python中日期和时间的标准数据类型。记住,我们永远不应该循环每一行来执行计算。pandas实际上提供了一种将字符串值转换为datetime数据类型的便捷方法。
df['成立时间'] =pd.to_datetime(df['成立时间'])
一旦列为datetime数据类型,计算持续时间就变得很容易了。我们将导入datetime库来处理日期和时间。
import datetime
today = datetime.datetime.today()
days = today - df['成立时间']
df['成立年数'] =days.dt.days / 365
其中,days是一个pandas系列,包含从“成立时间”到今天的天数。如果检查其类型,它会显示timedelta:

图5
timedelta是datetime的一个子类。与我们刚才看到的.str类似,pandas还有一个.dt返回datetime对象的列。因此,days.dt.days只是从timedelta对象返回天数的整数值。然后,将这些数字除以365,我们得到一列年数。
处理数据框架中NAN或Null值
当单元格为空时,pandas将自动为其指定NAN值。我们需要首先考虑这些值,因为在大多数情况下,pandas不知道如何处理它们。我们可以使用.fillna()方法将NAN值替换为我们想要的任何值。出于演示目的,这里只是将NAN值替换为字符串值“0”。

图6
数据类型转换 & 数据框架上的简单算术运算
最后,我们将使用“成年年份”列来计算公司的年龄。
df['成立年份'] = df['成立时间'].str.split("-",expand=True)[0]
无需检查数据类型,我们知道这个新创建的列包含字符串数据,因为.split()方法将返回一个字符串。注意,必须先把字符串转换成数字。由于今年是2021年,我们将用它来估算公司的年龄,从2021年减去每个“成立年份”。
df['成立年份'] = df['成立年份'].astype(int)
df['公司年龄'] = 2021 -df['成立年份']

图7