HOWTO · Pandas
如何在 Pandas DataFrame 中创建一个空列
我们可以使用简单赋值运算符、reindex()、assign() 和 insert() 方法,向 Pandas DataFrame 添加空列。
本页内容
在 Python 中向现有的 pandas DataFrame 添加空列时,若要填入空文本,可使用 df["NewColumn"] = "";若要填入缺失值,则使用 df["NewColumn"] = float("nan")(NaN)。这两种方式都会保留现有行和其他列。空字符串是文本值,因此应根据后续计算和筛选的需要选择合适的表示方式。
若要添加多个列,可使用 reindex();若要返回包含指定新增列的 DataFrame,可使用 assign();若要控制列的位置,则可使用 insert()。这些示例需要 pandas 和 NumPy。
使用简单赋值创建空列
将标量赋给新列时,该值会重复填入每个现有行。赋值会直接修改 df,并在最右侧追加新列。如果列名已经存在,赋值会替换该列的内容;若要保留原有数据,请使用一个新的列名。
此示例比较空字符串、NumPy 的缺失值标记,以及空的 pandas Series:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import pandas as pd
import numpy as np
dates = ["April-20", "April-21", "April-22", "April-23", "April-24", "April-25"]
income = [10, 20, 10, 15, 10, 12]
expenses = [3, 8, 4, 5, 6, 10]
df = pd.DataFrame({"Date": dates, "Income": income, "Expenses": expenses})
df["Empty_1"] = ""
df["Empty_2"] = np.nan
df["Empty_3"] = pd.Series()
print(df)
输出:
Date Income Expenses Empty_1 Empty_2 Empty_3
0 April-20 10 3 NaN NaN
1 April-21 20 8 NaN NaN
2 April-22 10 4 NaN NaN
3 April-23 15 5 NaN NaN
4 April-24 10 6 NaN NaN
5 April-25 12 10 NaN NaN
Empty_1 中是空字符串,而 Empty_2 中是 NaN。赋值对象为 Series 时,pandas 会根据索引标签将其与 DataFrame 的行标签对齐。空的 Series 没有匹配的标签,因此 Empty_3 的值也全部是缺失值。
若要明确指定类型,可使用 df["NewColumn"] = pd.Series(index=df.index, dtype="float64")。加入 df.index 可明确表达预期的行对齐方式。之后若要选出缺失值,请使用 df["NewColumn"].isna(),不要用相等比较来判断 NaN;空字符串则需单独与 "" 比较。
使用 pandas.DataFrame.reindex() 方法在 Pandas 中添加空列
pandas.DataFrame.reindex() 方法会返回一个 DataFrame,其中包含指定的列标签和顺序。新加入的列标签默认填入缺失值。请注意:columns 指定的是结果的完整列清单,而不只是要新增的列。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import pandas as pd
import numpy as np
dates = ["April-20", "April-21", "April-22", "April-23", "April-24", "April-25"]
income = [10, 20, 10, 15, 10, 12]
expenses = [3, 8, 4, 5, 6, 10]
df = pd.DataFrame({"Date": dates, "Income": income, "Expenses": expenses})
column_names = ["Empty_1", "Empty_2", "Empty_3"]
df = df.reindex(columns=column_names)
print(df)
输出:
Empty_1 Empty_2 Empty_3
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
这里的结果保留了六个行标签,但移除了 Date、Income 和 Expenses。将结果重新赋给 df 会替换原来的引用。
若要保留原有数据,请先取得 df.columns.tolist(),再附加新列名。这样会保留现有列的顺序,并将新增列放在右侧。此方法不会原地修改原对象,因此请保存其返回的 DataFrame。运行此示例:
import pandas as pd
import numpy as np
dates = ["April-20", "April-21", "April-22", "April-23", "April-24", "April-25"]
income = [10, 20, 10, 15, 10, 12]
expenses = [3, 8, 4, 5, 6, 10]
df = pd.DataFrame({"Date": dates, "Income": income, "Expenses": expenses})
df = df.reindex(columns=df.columns.tolist() + ["Empty_1", "Empty_2", "Empty_3"])
print(df)
输出:
Date Income Expenses Empty_1 Empty_2 Empty_3
0 April-20 10 3 NaN NaN NaN
1 April-21 20 8 NaN NaN NaN
2 April-22 10 4 NaN NaN NaN
3 April-23 15 5 NaN NaN NaN
4 April-24 10 6 NaN NaN NaN
5 April-25 12 10 NaN NaN NaN
原有的日期、收入和支出列都保留下来,后面接着三个值为 NaN 的列。请使用尚未存在的列名,以免请求重复标签。
使用 pandas.DataFrame.assign() 向 Pandas DataFrame 添加空列
pandas.DataFrame.assign() 方法会返回一个包含一个或多个指定名称列的 DataFrame。每个关键字都指定一个列名,并提供该列的值。如 df = df.assign(...) 所示,请保留返回的对象;也可以将它存入另一个变量,以保留原始 DataFrame。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import pandas as pd
import numpy as np
dates = ["April-20", "April-21", "April-22", "April-23", "April-24", "April-25"]
income = [10, 20, 10, 15, 10, 12]
expenses = [3, 8, 4, 5, 6, 10]
df = pd.DataFrame({"Date": dates, "Income": income, "Expenses": expenses})
df = df.assign(Empty_1="", Empty_2=np.nan)
print(df)
输出:
Date Income Expenses Empty_1 Empty_2
0 April-20 10 3 NaN
1 April-21 20 8 NaN
2 April-22 10 4 NaN
3 April-23 15 5 NaN
4 April-24 10 6 NaN
5 April-25 12 10 NaN
Empty_1 中是空字符串,只有 Empty_2 中是 NaN。现有列都保留了。与直接赋值一样,如果指定的列名已经存在,返回的 DataFrame 中该列会被替换。
使用 pandas.DataFrame.insert() 向 DataFrame 添加空列
需要控制列的位置时,可使用 pandas.DataFrame.insert()。调用形式为 df.insert(loc, column, value):loc 是从零开始计数的列位置,column 是新列的标签,且必须提供 value。要填入空文本,请传入 "";要填入缺失值,请传入 np.nan。
位置必须介于 0 和 len(df.columns) 之间,且包含这两个端点;上限位置会将列追加到末尾。默认情况下,插入已存在的标签会失败。传入 allow_duplicates=True 可以允许重复标签,但之后选择列时可能会产生歧义。
与 assign() 和 reindex() 不同,insert() 会原地修改 df,并返回 None。不要写成 df = df.insert(...)。
以下示例会在末尾追加两列:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import pandas as pd
import numpy as np
dates = ["April-20", "April-21", "April-22", "April-23", "April-24", "April-25"]
income = [10, 20, 10, 15, 10, 12]
expenses = [3, 8, 4, 5, 6, 10]
df = pd.DataFrame({"Date": dates, "Income": income, "Expenses": expenses})
df.insert(3, "Empty_1", "")
df.insert(4, "Empty_2", np.nan)
print(df)
输出:
Date Income Expenses Empty_1 Empty_2
0 April-20 10 3 NaN
1 April-21 20 8 NaN
2 April-22 10 4 NaN
3 April-23 15 5 NaN
4 April-24 10 6 NaN
5 April-25 12 10 NaN
Empty_1 位于从零开始计数的位置 3,也就是第 4 列,内容为空字符串。插入该列后,位置 4 可用于 Empty_2,其内容为 NaN。若要将列放在最前面,可使用 loc=0;现有列会向右移动,但其值不会改变。