一、四种新增方法
在进行数据分析时,原始数据因为格式的原因不能直接分析,经常需要按照一定条件创建新列,然后进行下一步分析
1、直接赋值
2、apply
3、assign
4、分条件赋值
二、示例
1、直接赋值
1)读取.csv
import pandas as pd df=pd.read_csv("./beijing_tianqi/beijing_tianqi_2018.csv") print(df.head())
'''
 ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
0  2018-01-01     3℃    -6℃   晴~多云       东北风   1-2级   59       良         2
1  2018-01-02     2℃    -5℃   阴~多云       东北风   1-2级   49       优         1
2  2018-01-03     2℃    -5℃     多云        北风   1-2级   28       优         1
3  2018-01-04     0℃    -8℃      阴       东北风   1-2级   28       优         1
4  2018-01-05     3℃    -6℃   多云~晴       西北风   1-2级   50       优         1
'''
2)直接赋值:清理温度列,变成数字类型,即去掉温度值后的℃
df.loc[:,'bWendu']=df['bWendu'].str.replace('℃','').astype('int32') df.loc[:,'yWendu']=df['yWendu'].str.replace('℃','').astype('int32') print(df.head())
'''
 ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
0  2018-01-01       3      -6   晴~多云       东北风   1-2级   59       良         2
1  2018-01-02       2      -5   阴~多云       东北风   1-2级   49       优         1
2  2018-01-03       2      -5     多云        北风   1-2级   28       优         1
3  2018-01-04       0      -8      阴       东北风   1-2级   28       优         1
4  2018-01-05       3      -6   多云~晴       西北风   1-2级   50       优         1
'''
3)添加新列:计算温差,并添加“wencha”列
df['bWendu']是一个series,是个单个列
#计算温度差 df.loc[:,'wencha']=df['bWendu']-df['yWendu'] print(df.head())
'''
 ymd bWendu yWendu tianqi ... aqi aqiInfo aqiLevel wencha
0  2018-01-01       3      -6   晴~多云  ...  59       良         2      9
1  2018-01-02       2      -5   阴~多云  ...  49       优         1      7
2  2018-01-03       2      -5     多云  ...  28       优         1      7
3  2018-01-04       0      -8      阴  ...  28       优         1      8
4  2018-01-05       3      -6   多云~晴  ...  50       优         1      9
'''
df.loc[:,'?']='待写入'
print(df.head())
'''
 ymd bWendu yWendu tianqi ... aqiInfo aqiLevel wencha ?
0  2018-01-01       3      -6   晴~多云  ...       良        2       9  待写入
1  2018-01-02       2      -5   阴~多云  ...       优        1       7  待写入
2  2018-01-03       2      -5     多云  ...       优        1       7  待写入
3  2018-01-04       0      -8      阴  ...       优        1       8  待写入
4  2018-01-05       3      -6   多云~晴  ...       优        1       9  待写入
'''
2、df.apply方法:推荐使用此方法
沿着dataframe某个轴应用函数,传给这个函数的是dataframe的行index(axis=0),或者是列的index(axis=1);传给函数的参数就是个Series
实例:添加一列温度类型
1)如果最高温度大于33度就是高温
2)低于-10度就是低温
3)否则是常温
#df.apply()方法 def get_wendu_type(x): if x['bWendu']>33: return '高温' if x['yWendu']<-10: return '低温' return '常温' df.loc[:,'wendu-类型']=df.apply(get_wendu_type,axis=1) print(df.head()) '''
ymd bWendu yWendu tianqi ... aqiLevel wencha ? wendu-类型 0 2018-01-01 3 -6 晴~多云 ... 2 9 待写入 常温 1 2018-01-02 2 -5 阴~多云 ... 1 7 待写入 常温 2 2018-01-03 2 -5 多云 ... 1 7 待写入 常温 3 2018-01-04 0 -8 阴 ... 1 8 待写入 常温 4 2018-01-05 3 -6 多云~晴 ... 1 9 待写入 常温
'''
#应用series.value_counts()方法查看各值的个数统计
print(df['wendu-类型'].value_counts())
'''
[5 rows x 12 columns]
常温    328
高温     29
低温      8
Name: wendu-类型, dtype: int64
'''
3、、df.assign方法:使用此方法不会改变原有df的值,因此需要把它赋值给另外一个dataframe
1)可以一次新增多个列
2)直接传index为columns的series传给函数,而apply方法需要指定是行还是列
#df.assign()方法
'''增加华氏温度列,最低温和最高温全部转成华氏度'''
a=df.assign(
ywendu_huashi=lambda x:x['yWendu']*9/5+32,
bWendu_huashi=lambda x:x['bWendu']*9/5+32
)
print(a.head())
print(a.head())
'''
 bWendu yWendu tianqi ... aqiLevel ywendu_huashi bWendu_huashi
ymd                                ...                                      
2018-01-01       3      -6   晴~多云  ...        2          21.2           37.4
2018-01-02       2      -5   阴~多云  ...        1          23.0           35.6
2018-01-03       2      -5     多云  ...        1          23.0           35.6
2018-01-04       0      -8      阴  ...        1          17.6           32.0
2018-01-05       3      -6   多云~晴  ...        1          21.2           37.4
'''
4、按条件选择分组分别赋值:按条件选择数据,然后对这部分数据赋值新列
实例:高低温差大于10度认为是‘温差大’,否则是正常
#按条件选择分组分别赋值:按条件选择数据,然后对这部分数据赋值新列 df['wencha_type']='*' #新建‘温差类别’列,并先赋值为‘*’ print(df.head()) df.loc[df['bWendu']-df['yWendu']>10,'wencha_type']='温差大' df.loc[df['bWendu']-df['yWendu']<=10,'wencha_type']='温差正常' print(df.head()) print(df['wencha_type'].value_counts()) ''' bWendu yWendu tianqi fengxiang ... aqi aqiInfo aqiLevel wencha_type ymd ... 2018-01-01 3 -6 晴~多云 东北风 ... 59 良 2 * 2018-01-02 2 -5 阴~多云 东北风 ... 49 优 1 * 2018-01-03 2 -5 多云 北风 ... 28 优 1 * 2018-01-04 0 -8 阴 东北风 ... 28 优 1 * 2018-01-05 3 -6 多云~晴 西北风 ... 50 优 1 * ''' ''' bWendu yWendu tianqi fengxiang ... aqi aqiInfo aqiLevel wencha_type ymd ... 2018-01-01 3 -6 晴~多云 东北风 ... 59 良 2 温差正常 2018-01-02 2 -5 阴~多云 东北风 ... 49 优 1 温差正常 2018-01-03 2 -5 多云 北风 ... 28 优 1 温差正常 2018-01-04 0 -8 阴 东北风 ... 28 优 1 温差正常 2018-01-05 3 -6 多云~晴 西北风 ... 50 优 1 温差正常 ''' ''' 温差正常 187 温差大 178 Name: wencha_type, dtype: int64 '''
df['寒冷程度']='**' df.loc[df['yWendu']<-10,'寒冷程度']='特冷' df.loc[(df['yWendu']>=-5) & (df['bWendu']<10),'寒冷程度']='暖冬' print(df.head()) print(df['寒冷程度'].value_counts()) ''' bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel 寒冷程度 ymd 2018-01-01 3 -6 晴~多云 东北风 1-2级 59 良 2 ** 2018-01-02 2 -5 阴~多云 东北风 1-2级 49 优 1 暖冬 2018-01-03 2 -5 多云 北风 1-2级 28 优 1 暖冬 2018-01-04 0 -8 阴 东北风 1-2级 28 优 1 ** 2018-01-05 3 -6 多云~晴 西北风 1-2级 50 优 1 ** ** 307 暖冬 50 特冷 8 Name: 寒冷程度, dtype: int64 '''