DataFrame是一个【表格型】的数据结构,可以看做是由【Series组成的字典】 DataFrame由按一定顺序排列的多列数据组成。 设计初衷是将Serise的使用场景从一维拓展到多维。 DataFrame既有行索引,也有列索引。 行索引:index 列索引:columns 值:values(numpy的二维数组)
一、创建
最常用的方法是传递一个字典来创建。DataFrame以字典的键作为每一【列】的名称,以字典的值(一个数组)作为每一列。此外,DataFrame会自动加上每一行的索引(和Series一样)。同Series一样,若传入的列与字典的键不匹配,则相应的值为NaN。
df = DataFrame(data={"python": np.random.randint(0, 150, size=5),
"math": np.random.randint(0, 150, size=5),
"en": np.random.randint(0, 150, size=5)},
index=list("ABCDE"))
print(df)
df2 = DataFrame(data=np.random.randint(0, 150, size=(10, 4)),
index=list("ABCDEFGHIJ"),
columns=["Python", "Math", "En", "Chi"])
print(df2)
输出结果如下:
二、保存
df2.to_csv("df2_data.txt")
df2.to_excel("df2_data.xlsx")
# 读取数据,读取txt文件
df3 = pd.read_csv("df2_data.txt")
# 把读取的unnamed = 0改名为Index,因为改的是列索引,所以axis=1
df4 = df3.rename(mapper={"Unnamed: 0": "Index"}, axis=1)
print(df3)
# 直接打印输出df3不变,为什么?需要用df4去接收
print(df4)
三、读取
# 读取数据,读取txt文件
df3 = pd.read_csv("df2_data.txt")
# 把读取的unnamed = 0改名为Index,因为改的是列索引,所以axis=1
df4 = df3.rename(mapper={"Unnamed: 0": "Index"}, axis=1)
print(df3)
# 直接打印输出df3不变,需要用df4去接收
print(df4)
输出结果如下:
# 读取数据,读取excel文件
df5 = pd.read_excel("df2_data.xlsx")
print(df5)
输出结果如下:
四、索引
首先创建一个DataFrame。
df2 = DataFrame(data=np.random.randint(0, 150, size=(10, 4)),
index=list("ABCDEFGHIJ"),
columns=["Python", "Math", "En", "Chi"])
列索引:
# 获取某一列,该列就是一个Series,可以通过属性方式获取
print(df2.Python)
print(df2[["Math", "En"]])
输出结果如下:
行索引:
# 获取某一行,只能使用loc和iloc
print(df2.loc[["A", "B"]])
print(df2.iloc[[3, 5]])
输出结果如下:
元素索引:
# 对于元素的索引
# 先找列,再找行可以直接使用中括号,反过来不行
print(df2["Math"]["C"])
# 先找行,再找列,要使用loc,永远都是先找行,再找列即df.loc["index","column"]
print(df2.loc["C"]["Math"])
print(df2.loc["C", "Math"])
输出结果都为:134
五、切片
行切:
# 直接使用中括号切片不能对列切片,只能对行切,即拦腰斩断
print(df2['A':'B'])
print(df2.loc['A':'B'])
print(df2.iloc[0:2])
输出结果如下:
列切:
# 列切,只能用这种方式
print(df2.iloc[:, 0:2])
输出结果如下: