Pandas的DataFrame

1. 手工创建DataFrame

1 a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
2 data = DataFrame(a)

 2. Excel数据数据没有顶头的处理

 1 import os
 2 import pandas as pd
 3 base_path = "D:\\practicespace\\Python\\datasets"
 4 file_name = "data.xlsx"
 5 path = os.path.join(base_path, file_name)
 6 print(path)
 7 if(os.path.exists(path)):
 8     print("file exists")
 9 
10 data = pd.read_excel(path, sheet_name="Sheet4", header=2, usecols="C:J")
11 data.head()

 

3. 字段值统计

 data.Region.value_counts() 

output:

EOC    36675

SOC    28468

WOC    20460

NOC    16017

Name: Region, dtype: int64

4.字段包含特殊符号(比如空格)的索引方式

不能再采用".字段名“的方式,而是要采用字符索引方式:

1 print("region count: ", len(data.Region.value_counts()))
2 print("Sub Region count: ", len(data["Sub Region"].value_counts()))

 

或者去掉特殊,然后再进行字段直接索引

df = df.rename(columns=lambda x: x.replace("'","").replace('"','')).replace(" ","")

 

5. 缺失值处理

1)统计缺失值

1 total = data.isnull().sum().sort_values(ascending=True)
2 percent = (data.isnull().sum()/data.isnull().count()).sort_values(ascending=True)
3 table = pd.concat([total, percent], axis=1, keys=["total", "percent"])

 

2)删除缺失值的行列

1 # 使用dropna方法删除含有缺失值的行,默认是行
2 print(data.dropna())
3 # 删除含有缺失值的列
4 print(data.dropna(axis=1))

 

3)填充缺失值

 1 from pandas import DataFrame
 2 a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
 3 data = DataFrame(a)
 4 print(data)
 5 # 统一填充缺失值为指定值
 6 print(data.fillna(0))
 7 # index=1(从0开始)列缺失值填充为1,index=2的列的缺失值填充为2
 8 print(data.fillna({1:1,2:2}))
 9 # 使用平均值进行填充
10 print(data.fillna(data.mean()))
11 # 前向填充,使用默认是上一行的值,设置axis=1可以使用列进行填充,不存在或者上一行也是None的时候就不填充
12 print(data.fillna(method="ffill"))
13 print()
14 # 后向填充,使用下一行的值,不存在或者下一行也是None的时候就不填充
15 print(data.fillna(method="bfill"))

 

6.遍历数据运算

 1 # 最原始,效率最低的迭代方案
 2 def myfunction(df):
 3     res_list = []
 4     for i in range(0,len(df)):
 5         res_list.append(df.iloc[i]['first']/df.iloc[i][‘second'])
 6     return disftance_list
 7 # 通过iterrows做遍历
 8 def haversine_looping(df):
 9     disftance_list = []
10     for index,row in df.iterrows():
11         disftance_list.append(row[‘high']/row[‘open'])
12     return disftance_list
13 # Cython做了全局优化,效率比iterrow有所提高,这里注意axis必须要设置
14 df.apply(lambda row: row[‘high']/row[‘open'], axis =1)
15 # pandas的矢量化处理,比较快,做了底层实现优化
16 dftest4['rate'] = dftest4['high']/dftest4['open']
17 # 通过values将pandas的serias数据转化为numpy arrays,效率最高,因为numpy在底层做了C的预编译
18 dftest5['rate'] = dftest5['high'].values/dftest5['open'].values

 

7. 列内容重置

1 df1['total'] = df1.Jan + df1.Feb + df1.Mar
2 df1['category'] = np.where(df1['total'] > 200000, 'A', 'B')

 

这里注意,如果是total已经存在,可以通过df1.total的索引方式,但是如果是新创建的列,只能通过["columnName"]的方式进行索引。

8. 删除列

1 del DF['column-name']
2 DF= DF.drop('column_name', 1);
3 DF.drop('column_name',axis=1, inplace=True)
4 DF.drop([DF.columns[[0,1, 3]]], axis=1,inplace=True)   # Note: zero indexed

 

9. group

在pandas里面的group,分组和运算是分开的,对于聚合则是在group之后通过调用sum,mean之类的函数基于分组做运算;

1 # 单分组
2 groupall = data.groupby("Region")
3 groupall = groupall.sum()
4 groupall
5 # 多分组
6 groupall = data.groupby(["Region", "Sub Region"])
7 groupall = groupall.sum()
8 groupall

 

10. reindex vs. reset_index

reindex是进行列重排,需要指定要保留那些列(也可以指定新列),

1 df = pd.DataFrame(np.arange(9).reshape(3,3), index=[2,3,1], columns=['a','b','c'])
2 df
3 df1=df.reindex(columns=['a','b'])
4 df1
  df2=df.reindex(columns=['a','b','e'])
  df2

 

df返回为:

   a b c
2 0 1 2
3 3 4 5
1 6 7 8

df1返回为(看到c列已经消失了):

 a b
2 0 1
3 3 4
1 6 7

df2返回为:

 a b e
2 0 1 NaN
3 3 4 NaN
1 6 7 NaN

reset_index则是重新创建一个索引列,一般group之后索引列就消失了,所以需要通过reset_index重新插入一列索引,默认不改变数据,只是插入一列索引列,可以通过指定drop参数来对原索引列进行删除(group之类的聚合操作已经没有原索引列信息了)。

>>> df = pd.DataFrame(np.arange(9).reshape(3,3), index=[2,3,1], columns=['a','b','c'])
>>> df

>>> df2 =df.reset_index()
>>> df2

>>> df3 = df.reset_index(drop=True) #删除原索引列
>>> df3

>> 输出的df为:

   a b c
2 0 1 2
3 3 4 5
1 6 7 8

>> 输出的df2为:

  index  a b c
0 2    0 1 2
1 3    3 4 5
2 1    6 7 8

>> 输出的df3为:

 a b c
0 0 1 2
1 3 4 5
2 6 7 8

 

 

参考:

https://www.jianshu.com/p/e664b9a3bf70

https://blog.csdn.net/katyusha1/article/details/81501893

缺失值处理

https://blog.csdn.net/sinat_29957455/article/details/79017363

迭代处理

https://blog.csdn.net/m0_37382341/article/details/83716988

 

 

 

 

 

 

 

 

 

 

posted on 2019-08-30 13:12  下士闻道  阅读(408)  评论(0编辑  收藏  举报

导航