今天学习了运用pandas跟numpy实现二维数据的清洗跟分析,总的来说我学习速度太快,其实根基并不稳,所以在此等于重新敲一遍代码并且分析步骤内容,对今天的学习也是一种巩固.
1.shift函数运用(针对总体数据计算每(天/月/日)数据)
#导入数据
import pandas as pd
entries_and_exits = pd.DataFrame({
'ENTRIESn': [3144312, 3144335, 3144353, 3144424, 3144594,
3144808, 3144895, 3144905, 3144941, 3145094],
'EXITSn': [1088151, 1088159, 1088177, 1088231, 1088275,
1088317, 1088328, 1088331, 1088420, 1088753]
})
这是一组dataframe数据,结果以数据框形式存在
作业目的是得到两个数据的每天的客流量,处理过程很简单:即用每组数据的下一个数据减去上一个数据,此题可以先定义一个函数,然后对全文运用.
#定义减法函数
def get_hourly_entries_and_exits(entries_and_exits):
df =entries_and_exits - entries_and_exits.shift()
#shift函数是将所有数据向下位移,默认值periods=1,可以做修改
return df
print get_hourly_entries_and_exits(entries_and_exits)
2.applymap函数运用,定义一个函数,对全局使用
grades_df = pd.DataFrame(
data={'exam1': [43, 81, 78, 75, 89, 70, 91, 65, 98, 87],
'exam2': [24, 63, 56, 56, 67, 51, 79, 46, 72, 60]},
index=['Andre', 'Barry', 'Chris', 'Dan', 'Emilio',
'Fred
', 'Greta', 'Humbert', 'Ivan', 'James']
)
目的是将上述数据的成绩转换成我们想要的格式:90分以上为A,80以上为B,以此类推.过程:同理定义函数,对全局使用.
def convert_grades(grades):
if grades >= 90:
return "A"
#elif = elise if
elif grades >= 80:
return "B"
elif grades >= 70:
return "C"
elif grades >= 60:
return "D"
elif grades > 0:
return "F"
print grades_df.applymap(convert_grades)
3.apply函数运用,apply与mapapply类似,但是apply可以在不知道数据情况的前提下对数据进行处理,下题中数据与上题一样,但是我们需要在数据比例上给每位学生定义成绩.
grades_df = pd.DataFrame(
data={'exam1': [43, 81, 78, 75, 89, 70, 91, 65, 98, 87],
'exam2': [24, 63, 56, 56, 67, 51, 79, 46, 72, 60]},
index=['Andre', 'Barry', 'Chris', 'Dan', 'Emilio',
'Fred', 'Greta', 'Humbert', 'Ivan', 'James']
)
运用qcut函数将数组分类,例如:
pd.qcut(range(5), 3, labels=["good","medium","bad"])
output:
[good, good, medium, bad, bad]
Categories (3, object): [good < medium < bad]
此题同解:
def convert_grades_curve(exam_grades):
return pd.qcut(exam_grades,
[0, 0.1, 0.2, 0.5, 0.8, 1],
labels=['F', 'D', 'C', 'B', 'A'])
print convert_grades_curve(grades_df['exam1'])
print grades_df.apply(convert_grades_curve)
4.计算标准值,即每个值与均值相差多少个STD
def standardize(df):
change = (df - df.mean()) / df.std()
return change
print grades_df.apply(standardize)
5.pandas数据向量计算
import numpy as np
import pandas as pd
df = pd.DataFrame({
'a': [4, 5, 3, 1, 2],
'b': [20, 10, 40, 50, 30],
'c': [25, 20, 5, 15, 10]
})
print df.apply(np.mean)
print df.apply(np.max
这里计算了数据的均值和最大值,那如果计算第二大的值是多少?我自己的解法是,筛选出除了最大值剩余的值,再从中决定最大值.
print df[df < df.max() ].max()
另一种解法,编写函数,先对数据进行降序排序(ascending = False),然后返回数值中[1]该位置的数据即可.
def second_largest_in_column(column):
#sort_values对数据进行排序,默认升序排序
sort_column = column.sort_values(ascending = False)
return sort_column.iloc[1]
def second_largest(df):
return df.apply(second_largest_in_column)
second_largest(df)
下面提供几种pandas的dataframe与numpy的Series数据计算
import pandas as pd
s = pd.Series([1, 2, 3, 4])
df = pd.DataFrame({
0: [10, 20, 30, 40],
1: [50, 60, 70, 80],
2: [90, 100, 110, 120],
3: [130, 140, 150, 160]
})
print df
print '' # Create a blank line between outputs
print df + s
s = pd.Series([1, 2, 3, 4])
df = pd.DataFrame({0: [10], 1: [20], 2: [30], 3: [40]})
print df
print '' #创建一个空格
print df + s
s = pd.Series([1, 2, 3, 4])
df = pd.DataFrame({0: [10, 20, 30, 40]})
print df
print ''
print df + s
s = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
df = pd.DataFrame({
'a': [10, 20, 30, 40],
'b': [50, 60, 70, 80],
'c': [90, 100, 110, 120],
'd': [130, 140, 150, 160]
})
print df
print ''
print df + s
s = pd.Series([1, 2, 3, 4])
df = pd.DataFrame({
'a': [10, 20, 30, 40],
'b': [50, 60, 70, 80],
'c': [90, 100, 110, 120],
'd': [130, 140, 150, 160]
})
print df
print df + s
总结:对同一个标签的数据,数据会进行向量运算,对于标签数据不同的数据,简单相加会使得数据框扩充,但是对于不相同的标签数据会以NA填充.
6.dataframe计算标准值
之前已经计算过很多次标准值,这里是在dataframe中计算
grades_df = pd.DataFrame(
data={'exam1': [43, 81, 78, 75, 89, 70, 91, 65, 98, 87],
'exam2': [24, 63, 56, 56, 67, 51, 79, 46, 72, 60]},
index=['Andre', 'Barry', 'Chris', 'Dan', 'Emilio',
'Fred', 'Greta', 'Humbert', 'Ivan', 'James']
)
s = grades_df.mean()
t = grades_df.std()
(s - grades_df) / t
6.groupby函数运用
在R中已经学过groupby函数的基本用法,大致就是将数据按照所想要的标签进行划分.
subway_df = pd.read_csv('nyc-subway-weather.csv') #导入数据
subway_df.head()
grouped_data = subway_df.groupby('day_week').mean()['ENTRIESn_hourly']
grouped_data
把数据按照每周的数据进行排列,然后按照每小时进入人数进行生成数据组,得出从星期一到星期天进站人数的数据.最后画图分析
%pylab inline
import seaborn as sns
grouped_data.plot()
接下来就要正式进入OSM项目了,今天刷XML格式有点晕,看来学习点真的太多,因为对我现在来说,数据只是以数据框形式展现给我的直观感受,最多只是CSV,EXCEL格式数据,可是对于数据分析来说,网站数据才是关键,学会爬取网站数据才是关键,加油,接下来接触的数据格式会得到一个升华,相信我也能得到进步.