关于python:如何在数据框中添加新的计算列?

How can I add a new computed column in a dataframe?

本问题已经有最佳答案,请猛点这里访问。

我试图根据我掌握的数据来计算一个人的年龄:

1
2
3
Data columns in 'Person' Dataframe:
TodaysDate   non-null datetime64[ns]
YOB          non-null float64

因此,我想在这个数据框架内创建一个名为"Age"的新列,到目前为止,我有以下代码:

1
2
3
Person['Age'] = map(sum, (Person.ix[0,'TodaysDate']).year, -(Person['YOB']))

TypeError: 'int' object is not iterable

我也尝试过:

1
2
3
Person['Age'] = map((Person.ix[0,'TodaysDate']).year - Person['YOB'])

TypeError: map() must have at least two arguments.

我试过其他问题上发布的几种不同方法,但似乎没有一种有效。这看起来很简单……但不能让它工作。

我可以用map函数将datetime列TodaysDate从float列YOB中减去,然后将值放入Age列吗?我想对数据帧中的每一行都这样做。

谢谢您!


这个答案主要是对assign的宣传。我是assign的粉丝,因为它返回了一个新的pd.DataFrame,它是旧pd.DataFrame的副本,包含了额外的列。在某些情况下,返回新的pd.DataFrame更合适。我觉得语法清晰直观。

另外,请注意,我已经在计算中添加了零值,因为我已经完全删除了@maxu的答案。

1
2
3
4
5
6
7
df.assign(Age=pd.datetime.now().year - df.YOB)

    YOB  Age
0  1955   62
1  1965   52
2  1975   42
3  1985   32

数据:

1
2
3
4
5
6
7
In [5]: df
Out[5]:
    YOB
0  1955
1  1965
2  1975
3  1985

您不需要额外的列TodaysDate—您可以动态获取它:

1
2
3
4
5
6
7
8
9
In [6]: df['Age'] = pd.datetime.now().year - df.YOB

In [7]: df
Out[7]:
    YOB  Age
0  1955   62
1  1965   52
2  1975   42
3  1985   32

或者,您可以使用dataframe.eval()方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
In [16]: df
Out[16]:
    YOB
0  1955
1  1965
2  1975
3  1985

In [17]: df.eval("Age = @pd.datetime.now().year - YOB", inplace=True)

In [18]: df
Out[18]:
    YOB  Age
0  1955   62
1  1965   52
2  1975   42
3  1985   32