在数据处理过程中,经常担心索引出错。没关系,这次就和大家聊聊pandas中处理索引的几种常用方法。1.读取时指定索引列很多情况下,我们的数据源是CSV文件。假设有一个名为data.csv的文件,其中包含以下数据。date,temperature,humidity07/01/21,95,5007/02/21,94,5507/03/21,94,56pandas默认会创建一个从0开始的索引行,如下:>>>pd.read_csv("data.csv",parse_dates=["date"])datetemperaturehumidity02021-07-01955012021-07-02945522021-07-039456但是我们可以直接在导入过程中通过给某列index_col参数设置index列来指定.>>>pd.read_csv("data.csv",parse_dates=["date"],index_col="date")temperaturehumiditydate2021-07-0195502021-07-0294552021-07-0394562。当然使用已有的DataFrame来设置索引,如果数据已经被读取或者经过一些数据处理步骤,我们可以通过set_index手动设置索引。>>>df=pd.read_csv("data.csv",parse_dates=["date"])>>>df.set_index("date")temperaturehumiditydate2021-07-0195502021-07-0294552021-07-039456有两个需要注意的地方。1、set_index方法默认会新建一个DataFrame。如果你想就地改变df的索引,你需要设置inplace=True。df.set_index(“date”,inplace=True)2.如果要保留要设置为索引的列,可以设置drop=False。df.set_index(“date”,drop=False)3.一些操作后重置索引在处理DataFrame时,某些操作(如删除行、索引选择等)会生成原始索引的一个子集,所以默认数索引排序搞砸了。要重新生成连续索引,可以使用reset_index方法。>>>df0=pd.DataFrame(np.random.rand(5,3),columns=list("ABC"))>>>df0ABC00.5480120.2885830.73427610.3428950.2079170.99548520.3787940.1609130.97195130.0397380.0084140.22651040.5810930.7503310.133022>>>df1=df0[df0.index%2==0]>>>df1ABC00.5480120.2885830.73427620.3787940.1609130.97195140.5810930.7503310.133022>>>df1.reset_index(drop=True)ABC00.5480120.2885830.73427610.3787940.1609130.97195120.5810930.7503310.133022通常,我们不需要保留旧索引,因此可以将drop参数设置为True。另外,如果想原地重置索引,可以将inplace参数设置为True,否则会创建一个新的DataFrame。4、常用于将索引从groupby操作转换为列groupby分组方式。比如下面的分组就是通过添加分组列team来进行的。>>>df0["团队"]=["X","X","Y","Y","Y"]>>>df0ABCteam00.5480120.2885830.734276X10.3428950.2079170.995485X20.3787940.1609130.971951Y34.03507Y240.5810930.7503310.133022Y>>>df0.groupby("team").mean()ABCteamX0.4454530.2482500.864881Y0.3332080.3065530.443828默认情况下,分组会将分组列编入索引。但是很多时候,我们并不希望分组列成为索引,因为一些计算或者判断逻辑可能还是需要用到这一列。因此,我们需要进行设置,让分组列不成为索引,同时又能完成分组功能。有两种方法可以完成你想要的,第一种是使用reset_index,第二种是在groupby方法中设置as_index=False。个人更喜欢第二种方法,只需要两步,更简洁。>>>df0.groupby("团队").mean().reset_index()teamABC0X0.4454530.2482500.8648811Y0.3332080.3065530.443828>>>df0.groupby("团队",as_index=False).mean()5082530.4425.8648811Y0.3332080.3065530.4438285.排序后重置索引。使用sort_value排序方式也会遇到这个问题,因为默认情况下,索引index是随着排序顺序变化的,所以是乱雪。如果我们希望索引不随排序而改变,我们还需要在sort_values方法中设置参数ignore_index。>>>df0.sort_values("A")ABCteam30.0397380.0084140.226510Y10.3428950.2079170.995485X20.3787940.1609130.971951Y00.5480120.2885830.734276X40.5810930.7503310.133022Y>>>df0.sort_values("A",ignore_index=True)ABCteam00.0397380.0084140.226510Y10.3428950.2079170.995485X20.3787940.1609130.971951Y30.5480120.2885830.734276X40.5810930.7503310.133022Y6.删除重复项后,重置默认排序顺序并删除重复项。同样,您可以在drop_duplicates方法中将ignore_index参数设置为True。>>>df0ABCteam00.5480120.2885830.734276X10.3428950.2079170.995485X20.3787940.1609130.971951Y30.0397380.0084140.226510Y40.5810930.7503310.133022Y>>>df0.drop_duplicates("team",ignore_index=True)ABCteam00.5480120.2885830.734276X10.3787940.1609130.971951Y7.当我们有一个DataFrame并且想要使用不同的数据源或单独的操作来分配索引时,索引直接分配。在这种情况下,索引可以直接分配给现有的df.index。>>>better_index=["X1","X2","Y1","Y2","Y3"]>>>df0.index=better_index>>>df0ABCteamX10.5480120.2885830.734276XX20.3428950.2079170.995485XY10.5787103Y100.16909.0397380.0084140.226510YY30.5810930.7503310.133022Y8.写入CSV文件时忽略索引当导出数据到CSV文件时,默认DataFrame的索引从0开始。如果我们不想将其包含在导出的CSV文件中,我们可以设置to_csv方法中的索引参数。>>>df0.to_csv("exported_file.csv",index=False)如下图,在导出的CSV文件中,索引列是不包含在文件中的。其实很多方法都有索引的设置,但是人们一般关心的是数据,往往会忽略索引,这样在继续运行的时候可能会出错。以上高频操作都有指标设置。建议大家在平时使用的时候养成设置索引的习惯,这样可以节省很多时间。
