本节来介绍对创建的DataFrame的索引、行和列执行基本操作:添加、删除、重命名
创建DataFrame时,可以选择向“index”参数添加输入,以确保您拥有所需的索引。如果不指定此选项,默认情况下,DataFrame将具有以0开头的数值索引并一直持续到DataFrame的最后一行的值。
但是,即使自动为设置了索引,我们仍然可以重新使用其中一个列并将其作为索引。您可以通过调用set_index()
轻松完成此操作。看看下面的代码
import numpy as np
import pandas as pd
data = np.array([['', 'A', 'B', 'C'],
['0', 1, 2, 3],
['1', 4, 5, 6],
['2', 7, 8, 9]])
df = pd.DataFrame(data=data[1:, 1:],
index=data[1:, 0],
columns=data[0, 1:])
print(df, "\n")
# 设置名称为"C"这列作为DataFrame的index
df = df.set_index('C')
print(df)
输出如下:
A B C
0 1 2 3
1 4 5 6
2 7 8 9
A B
C
3 1 2
6 4 5
9 7 8
在添加行之前,需要先理解.iloc[]
,.loc[]
的区别:
.iloc[]
:是基于位置的索引.loc[]
:是基于标签的索引import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
index=[2.5, 12.6, 4.8],
columns=[48, 49, 50])
# 修改位置为2的那行
df.iloc[2] = [60, 50, 40]
print(df, "\n")
# 修改或添加标签为2的那行
df.loc[2] = [11, 12, 13]
print(df)
运行后输出:
48 49 50
2.5 1 2 3
12.6 4 5 6
4.8 60 50 40
48 49 50
2.5 1 2 3
12.6 4 5 6
4.8 60 50 40
2.0 11 12 13
注意:
在某些情况下,您希望将索引作为DataFrame的一部分。您可以通过从DataFrame中获取列或通过引用尚未创建的列并将其分配给.index
属性来轻松完成此操作,如下所示:
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
columns=['A', 'B', 'C'])
print(df.index)
# 添加列,名称为"D"
df['D'] = df.index
print(df)
输出如下:
RangeIndex(start=0, stop=3, step=1)
A B C D
0 1 2 3 0
1 4 5 6 1
2 7 8 9 2
代码df['D'] = df.index
的意思是将添加新的一行,列好为’D’,数据为df.index
。
上面已经了解了如何选择并向DataFrame添加索引、行和列,下面来实现从数据结构中删除这三个用例。
因为DataFrames和Series始终具有索引,所以要从DataFrame中删除索引,可以考虑这几种方式:
del df.index.name
,删除索引名称(如果有)DataFrame的索引我们可以执行此操作.reset_index()
进行重置。
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
index=[2.5, 12.6, 4.8],
columns=['A', 'B', 'C'])
print("重置前:\n", df)
# 使用reset_index()重置行标签
df_reset = df.reset_index(level=0, drop=True)
print("\n重置后:\n", df_reset)
输出如下:
重置前:
A B C
2.5 1 2 3
12.6 4 5 6
4.8 7 8 9
重置后:
A B C
0 1 2 3
1 4 5 6
2 7 8 9
现在尝试在上面的代码块中替换drop
参数inplace
,看看会发生什么!
删除重复的索引值需要使用drop_duplicates()函数操作。代码如下:
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [40, 50, 60], [23, 35, 37]]),
index=[2.5, 12.6, 4.8, 4.8, 2.5],
columns=[48, 49, 50])
print("df:\n", df)
# 使用drop_duplicates删除重复的行标签
df2 = df.reset_index().drop_duplicates(subset='index', keep='last')
print("\ndf2:\n", df2)
输出后:
df:
48 49 50
2.5 1 2 3
12.6 4 5 6
4.8 7 8 9
4.8 40 50 60
2.5 23 35 37
df2:
index 48 49 50
1 12.6 4 5 6
3 4.8 40 50 60
4 2.5 23 35 37
可以看到重复的行标签有2.5、4.8,最后他们一样的值只保留了最后一个。现在您已了解如何从DataFrame中删除索引,接下来就是删除列和行了。
要从DataFrame中删除列,可以使用以下drop()
方法:
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
index=[2.5, 12.6, 4.8],
columns=['A', 'B', 'C'])
print("删除前:\n", df)
# 删除标签是“A”的列
df.drop('A', axis=1, inplace=True)
print("删除后:\n", df)
运行后输出:
删除前:
A B C
2.5 1 2 3
12.6 4 5 6
4.8 7 8 9
删除后:
B C
2.5 2 3
12.6 5 6
4.8 8 9
drop()
的参数:
axis
:指定操作行或列,0为行、1为列。inplace
:为true则无需重新分配DataFrame,否则会重新创建DataFrame并返回。可以通过执行从DataFrame中删除重复的行df.drop_duplicates()
,和上面的"重置索引并删除重复的索引值"的效果一样。
另外还可以使用drop()
方法,示例代码如下:
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [23, 50, 60], [23, 35, 37]]),
index=[2.5, 12.6, 4.8, 4.8, 2.5],
columns=[48, 49, 50])
print("删除前:\n", df)
# 删除指定的位置
df.drop(df.index[2], inplace=True)
print("\n删除后:\n", df)
# 删除指定的行标签
df.drop(12.6, axis=0, inplace=True)
print("\n删除后:\n", df)
运行后输出:
删除前:
48 49 50
2.5 1 2 3
12.6 4 5 6
4.8 7 8 9
4.8 23 50 60
2.5 23 35 37
删除后:
48 49 50
2.5 1 2 3
12.6 4 5 6
2.5 23 35 37
删除后:
48 49 50
2.5 1 2 3
2.5 23 35 37
从结果可以知道:
.index()
方法指定要从DataFrame中删除指定位置的行。要为DataFrame的列或索引赋予不同的值,最好使用.rename()
方法。
import numpy as np
import pandas as pd
data = np.array([['', 'A', 'B', 'C'],
['0', 1, 2, 3],
['1', 4, 5, 6],
['2', 7, 8, 9]])
df = pd.DataFrame(data=data[1:, 1:],
index=data[1:, 0],
columns=data[0, 1:])
print("原始数据:\n", df)
# 定义列的新名称
newcols = {
'A': 'new_column_1',
'B': 'new_column_2',
'C': 'new_column_3'
}
# 使用rename()重命名列名称
df.rename(columns=newcols, inplace=True)
print("\n重命名列名称:\n", df)
# 使用rename()重命名索引
df.rename(index={'1': 'new_index_1'}, inplace=True)
print("\n重命索引标签:\n", df)
运行后输出:
原始数据:
A B C
0 1 2 3
1 4 5 6
2 7 8 9
重命名列名称:
new_column_1 new_column_2 new_column_3
0 1 2 3
1 4 5 6
2 7 8 9
重命索引标签:
new_column_1 new_column_2 new_column_3
0 1 2 3
new_index_1 4 5 6
2 7 8 9
rename()函数的参数:
若有疑问,欢迎联系作者(微信:lixu1770105)。