《Python数据分析基础》学习记录002:2.4选取连续的行,pandas方法实现

1、数据描述及要求:

详见文章末尾,需要练习的,直接复制,保存为csv文件。
数据的前三行(1,2,3)和后三行(16,17,18)为不需要保存的数据。
要求:丢弃这六行,在另外一个文件夹中保存中间的部分。

2、pandas模块思路分析

  1. 使用drop方法索引和丢弃不要的列。
  2. 使用.iloc[ ]方法,用整数来索引行或者列。
  3. 使用reindex方法,重新生成索引。
  4. 用to_csv()保存需要保存的行

问题:

用不用reindex的差别是什么?

3、涉及方法学习:

1)pandas.DataFrame.drop

DataFrame.drop(self, labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=‘raise’)[source]
删除指定标签的行或者列。
通过指定行或者列标签名称或者相关的轴名称来删除该行或者列。也可以通过直接指定需要删除的索引值或者列名称来删除行或者列。如果使用多重索引,一旦指定需要删除的层级,那么也可以删除该层级的标签。

详情请参照:

2)pandas.DataFrame.reindex

** DataFrame.reindex(self, labels=None, index=None, columns=None, axis=None, method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)**
按照一定的填充逻辑(可以添加或者默认),为数据结构(表格)建立新索引。
如果先前没有这个索引,那么该方法会将NA或者NaN填充到新增的索引的值中。除非新索引跟就索引相同而且copy= False,否则该方法会生成一个新的对象。
详见:

3)pandas.DataFrame.columns

返回数据表格的列标签

4)pandas.DataFrame.index

返回数据表格的索引或者行标签

4、实现代码:

import pandas as pd

file1 = 'supplier_data1.csv'
file2 = 'output_file.csv'

data_frame = pd.read_csv(file1, header=None)
data_frame = data_frame.drop([0, 1, 2, 16, 17, 18])
data_frame.columns = data_frame.iloc[0]
data_frame = data_frame.reindex(data_frame.index.drop(3))
data_frame.to_csv(file2, index=False)

1)分析:

data_frame = data_frame.drop([0, 1, 2, 16, 17, 18])

用于删除不要的前三行和后三行。

data_frame.columns = data_frame.iloc[0]

指定列标签

data_frame = data_frame.reindex(data_frame.index.drop(3))

使用去除掉原索引第三行之后的索引作为新索引

data_frame.to_csv(file2, index=False)

将处理完之后的值,写入新的csv文件。

2)直观演示

如果看1)已经看明白了,那就跳过2)吧。
如果看不明白,就接着看这里。
在每行代码中加了print,打印想要看到的值:

import pandas as pd

file1 = 'supplier_data1.csv'
file2 = 'output_file.csv'

data_frame = pd.read_csv(file1, header=None)
data_frame = data_frame.drop([0, 1, 2, 16, 17, 18])
#想看看drop是否被整正确执行,查看执行结果
print(data_frame.values)  # 1
data_frame.columns = data_frame.iloc[0]
# 想了解data_frame.columns是个什么东西
# 这样操作之后,数据表变成什么样子
print(data_frame.columns)  # 2
print(data_frame)  # 3
data_frame = data_frame.reindex(data_frame.index.drop(3))
print(data_frame.index)  # 4
data_frame.to_csv(file2, index=False)

下面是打印结果:
1、
[[‘Supplier Name’ ‘Invoice Number’ ‘Part Number’ ‘Cost’ ‘Purchase Date’]
[‘Supplier X’ ‘001-1001’ ‘2341’ '$500.00 ’ ‘1/20/14’]
[‘Supplier X’ ‘001-1001’ ‘2341’ '$500.00 ’ ‘1/20/14’]
[‘Supplier X’ ‘001-1001’ ‘5467’ '$750.00 ’ ‘1/20/14’]
[‘Supplier X’ ‘001-1001’ ‘5467’ '$750.00 ’ ‘1/20/14’]
[‘Supplier Y’ ‘50-9501’ ‘7009’ '$250.00 ’ ‘1/30/14’]
[‘Supplier Y’ ‘50-9501’ ‘7009’ '$250.00 ’ ‘1/30/14’]
[‘Supplier Y’ ‘50-9505’ ‘6650’ '$125.00 ’ ‘2002/3/14’]
[‘Supplier Y’ ‘50-9505’ ‘6650’ '$125.00 ’ ‘2002/3/14’]
[‘Supplier Z’ ‘920-4803’ ‘3321’ '$615.00 ’ ‘2002/3/14’]
[‘Supplier Z’ ‘920-4804’ ‘3321’ '$615.00 ’ ‘2002/10/14’]
[‘Supplier Z’ ‘920-4805’ ‘3321’ '$6,015.00 ’ ‘2/17/14’]
[‘Supplier Z’ ‘920-4806’ ‘3321’ '$1,006,015.00 ’ ‘2/24/14’]]
2、
Index([‘Supplier Name’, ‘Invoice Number’, ‘Part Number’, ‘Cost’,
‘Purchase Date’],
dtype=‘object’, name=3)
3、
3 Supplier Name Invoice Number Part Number Cost Purchase Date
3 Supplier Name Invoice Number Part Number Cost Purchase Date
4 Supplier X 001-1001 2341 $500.00 1/20/14
5 Supplier X 001-1001 2341 $500.00 1/20/14
6 Supplier X 001-1001 5467 $750.00 1/20/14
7 Supplier X 001-1001 5467 $750.00 1/20/14
8 Supplier Y 50-9501 7009 $250.00 1/30/14
9 Supplier Y 50-9501 7009 $250.00 1/30/14
10 Supplier Y 50-9505 6650 $125.00 2002/3/14
11 Supplier Y 50-9505 6650 $125.00 2002/3/14
12 Supplier Z 920-4803 3321 $615.00 2002/3/14
13 Supplier Z 920-4804 3321 $615.00 2002/10/14
14 Supplier Z 920-4805 3321 $6,015.00 2/17/14
15 Supplier Z 920-4806 3321 $1,006,015.00 2/24/14
4、
Int64Index([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], dtype=‘int64’)

可见,执行了data_frame.columns语句之后,data_frame多了一行——3。
这也就解释了为什么下面的reindex要使用去掉了索引为3的数据表格进行重新生成索引。

总结一下:

  1. pandas真的很强大,方法很多,但是很细致,如果结果不遂人愿,大可以在代码中增加print语句,看看返回的是什么玩意儿。之后再做代码调整。
  2. 多学习,多练习,多思考!

猜你喜欢

转载自blog.csdn.net/Haoyu_xie/article/details/106584373