最初的问题解决了一个特定的狭窄用例。对于那些需要更通用答案的人,这里有一些示例:
使用来自其他列的数据创建新列
鉴于以下数据框:
import pandas as pd
import numpy as np
df = pd.DataFrame([['dog', 'hound', 5],
['cat', 'ragdoll', 1]],
columns=['animal', 'type', 'age'])
In[1]:
Out[1]:
animal type age
----------------------
0 dog hound 5
1 cat ragdoll 1
下面我们通过使用系列覆盖description
的操作添加一个新列作为其他列的串联。+
花哨的字符串格式,f-strings等在这里不起作用,因为它+
适用于标量而不是“原始”值:
df['description'] = 'A ' + df.age.astype(str) + ' years old ' \
+ df.type + ' ' + df.animal
In [2]: df
Out[2]:
animal type age description
-------------------------------------------------
0 dog hound 5 A 5 years old hound dog
1 cat ragdoll 1 A 1 years old ragdoll cat
我们得到1 years
cat (而不是1 year
),我们将在下面使用条件来修复它。
使用条件修改现有列
在这里,我们将原始animal
列替换为其他列中的值,并np.where
用于根据 的值设置条件子字符串age
:
# append 's' to 'age' if it's greater than 1
df.animal = df.animal + ", " + df.type + ", " + \
df.age.astype(str) + " year" + np.where(df.age > 1, 's', '')
In [3]: df
Out[3]:
animal type age
-------------------------------------
0 dog, hound, 5 years hound 5
1 cat, ragdoll, 1 year ragdoll 1
使用条件修改多个列
一种更灵活的方法是调用.apply()
整个数据框而不是单个列:
def transform_row(r):
r.animal = 'wild ' + r.type
r.type = r.animal + ' creature'
r.age = "{} year{}".format(r.age, r.age > 1 and 's' or '')
return r
df.apply(transform_row, axis=1)
In[4]:
Out[4]:
animal type age
----------------------------------------
0 wild hound dog creature 5 years
1 wild ragdoll cat creature 1 year
在上面的代码中,transform_row(r)
函数接受一个Series
表示给定行的对象(用 表示axis=1
,默认值将为每一列axis=0
提供一个对象)。Series
这简化了处理,因为我们可以使用列名访问行中的实际“原始”值,并且可以看到给定行/列中的其他单元格。