初学者经常分不清何时用df[]、df.loc[]和df.iloc[],以及要不要先把检索词用[]括起来做成列表再传参,看完本文保准帮您彻底搞明白。
以以下df为例。
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
columns = ["A", "B", "C"]
df = pd.DataFrame(data=data, columns=columns)
"""
A B C
0 1 2 3
1 4 5 6
2 7 8 9
"""
目录
在df[]、df.loc[]和df.iloc[]这3个可选项中,如果同时抽行列,就只能用df.loc[]或df.iloc[],df[]情况稍复杂。
1 抽列
1.1 抽1列(1)
kw = "A"
s = df[kw]
# 或直接写:s = df["A"]
以上抽出“A”列。
当然也可直接写s = df[“A”],分开写是为了加深印象,可以直接传入1个字符串取出对应列。结果如下:
0 1
1 4
2 7
Name: A, dtype: int64
结果为“<class ‘pandas.core.series.Series’>”,一维。
可以传[“A”]吗?
kw = ["A"]
s = df[kw]
# 或直接写:s = df[["A"]]
A
0 1
1 4
2 7
当然可以,返回类型为“<class ‘pandas.core.frame.DataFrame’>”,二维。
请注意:df[]直接传入1个文本串的便利给了列了,抽行就不允许直接给df[]传入1个文本串了,哪怕行的索引名称与列的索引名称不同。在下述“抽行”中再详讲。
用df.loc[]如何抽出“A”列?
s = df.loc[:, "A"] # 得到Series
df1 = df.loc[:, ["A"]] # 得到DataFrame
同理如果用df.iloc[],这样写:
s = df.iloc[:, 0] # 得到Series
df1 = df.iloc[:, [0]] # 得到DataFrame
用到了半角冒号即切片,牵涉到“抽行列”了,在下述“3 抽行列”部分会具体再讲。
小小结:(1)df[“A”]或df.loc[:, “A”]或df.iloc[:, 0]:得到Series;(2)df[[“A”]]或df.loc[:, [“A”]]或df.iloc[:, [0]]:得到DataFrame。
s = df["A"]
s = df.loc[:, "A"]
s = df.iloc[:, 0]
"""
以上得到Series
"""
df1 = df[["A"]]
df1 = df.loc[:, ["A"]]
df1 = df.iloc[:, [0]]
"""
以上得到DataFrame
"""
1.2 抽指定单独多列(单多)
可以一口气指定两列吗,比如“A”和“C”?返回值不可能有Series了,只能是DataFrame。
kw = "A", "C" # 报错
df1 = df