一、四种新增方法

在进行数据分析时,原始数据因为格式的原因不能直接分析,经常需要按照一定条件创建新列,然后进行下一步分析

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
'''