新增数据
在进行数据分析时,经常需要根据一定条件创建新的数据列,然后及逆行进一步分析
-
直接赋值
-
df.apply方法
-
df.assign方法
-
按条件选择分组分别赋值
import pandas as pd
df=pd.read_excel("./weater_beijing.xlsx")
df.head()
<tr style="text-align: right;">
<th></th>
<th>日期</th>
<th>最高温</th>
<th>最低温</th>
<th>天气</th>
<th>风力风向</th>
<th>空气质量指数</th>
</tr>
<tr>
<th>0</th>
<td>2011-01-01 周六</td>
<td>-2°</td>
<td>-7°</td>
<td>多云~阴</td>
<td>无持续风向微风</td>
<td>NaN</td>
</tr>
<tr>
<th>1</th>
<td>2011-01-02 周日</td>
<td>-2°</td>
<td>-7°</td>
<td>多云</td>
<td>无持续风向微风</td>
<td>NaN</td>
</tr>
<tr>
<th>2</th>
<td>2011-01-03 周一</td>
<td>-2°</td>
<td>-6°</td>
<td>多云~阴</td>
<td>西北风~北风3-4级~4-5级</td>
<td>NaN</td>
</tr>
<tr>
<th>3</th>
<td>2011-01-04 周二</td>
<td>-2°</td>
<td>-9°</td>
<td>晴</td>
<td>北风5-6级</td>
<td>NaN</td>
</tr>
<tr>
<th>4</th>
<td>2011-01-05 周三</td>
<td>-2°</td>
<td>-10°</td>
<td>晴</td>
<td>北风~无持续风向3-4级~微风</td>
<td>NaN</td>
</tr>
# 替换温度的后缀°
df.loc[:,'最低温']=df['最低温'].str.replace("°","")
df.loc[:,'最高温']=df['最高温'].str.replace("°","")
df.loc[:,'最低温'].fillna('0',inplace=True)
df.loc[df['最低温']=='']
<tr style="text-align: right;">
<th></th>
<th>日期</th>
<th>最高温</th>
<th>最低温</th>
<th>天气</th>
<th>风力风向</th>
<th>空气质量指数</th>
</tr>
<tr>
<th>455</th>
<td>2012-04-11 周三</td>
<td>9</td>
<td></td>
<td>多云~</td>
<td>无持续风向~微风~</td>
<td>NaN</td>
</tr>
# 将最低温中''替换成0
df.loc[:,'最低温']=df['最低温'].replace('','0')
# 将最高温和最低温列的obj类型转换成int型
df.loc[:,'最低温']=df.loc[:,'最低温'].astype('int32')
df.loc[:,'最高温']=df.loc[:,'最高温'].astype('int32')
C:\Users\JDQ\AppData\Local\Temp\ipykernel_17304\77100508.py:2: DeprecationWarning: In a future version, `df.iloc[:, i] = newvals` will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either `df[df.columns[i]] = newvals` or, if columns are non-unique, `df.isetitem(i, newvals)`
df.loc[:,'最高温']=df.loc[:,'最高温'].astype('int32')
df.loc[df['日期']=='2012-04-11 周三']
<tr style="text-align: right;">
<th></th>
<th>日期</th>
<th>最高温</th>
<th>最低温</th>
<th>天气</th>
<th>风力风向</th>
<th>空气质量指数</th>
</tr>
<tr>
<th>455</th>
<td>2012-04-11 周三</td>
<td>9</td>
<td></td>
<td>多云~</td>
<td>无持续风向~微风~</td>
<td>NaN</td>
</tr>
- 直接赋值
实例:计算温差
df.dtypes
日期 object
最高温 int32
最低温 int32
天气 object
风力风向 object
空气质量指数 object
dtype: object
df['wencha']=df['最高温']-df['最低温']
df.head()
<tr style="text-align: right;">
<th></th>
<th>日期</th>
<th>最高温</th>
<th>最低温</th>
<th>天气</th>
<th>风力风向</th>
<th>空气质量指数</th>
<th>wencha</th>
</tr>
<tr>
<th>0</th>
<td>2011-01-01 周六</td>
<td>-2</td>
<td>-7</td>
<td>多云~阴</td>
<td>无持续风向微风</td>
<td>NaN</td>
<td>5</td>
</tr>
<tr>
<th>1</th>
<td>2011-01-02 周日</td>
<td>-2</td>
<td>-7</td>
<td>多云</td>
<td>无持续风向微风</td>
<td>NaN</td>
<td>5</td>
</tr>
<tr>
<th>2</th>
<td>2011-01-03 周一</td>
<td>-2</td>
<td>-6</td>
<td>多云~阴</td>
<td>西北风~北风3-4级~4-5级</td>
<td>NaN</td>
<td>4</td>
</tr>
<tr>
<th>3</th>
<td>2011-01-04 周二</td>
<td>-2</td>
<td>-9</td>
<td>晴</td>
<td>北风5-6级</td>
<td>NaN</td>
<td>7</td>
</tr>
<tr>
<th>4</th>
<td>2011-01-05 周三</td>
<td>-2</td>
<td>-10</td>
<td>晴</td>
<td>北风~无持续风向3-4级~微风</td>
<td>NaN</td>
<td>8</td>
</tr>
- df.apply方法
DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwargs)[source]
Apply a function along an axis of the DataFrame.
Objects passed to the function are Series objects whose index is either the DataFrame’s index (axis=0) or the DataFrame’s columns (axis=1). By default (result_type=None), the final return type is inferred from the return type of the applied function. Otherwise, it depends on the result_type argument.
实例:添加一列温度类型
1. 如果最高温度大于33度就是高温
2. 如果小于-10度就是低温
3. 否则就是常温
def get_wendu_type(x):
if x['最高温']>33:
return '高温'
if x['最低温']<-10:
return '低温'
return '常温'
# 这里需要设置axis==1,这是series的index是columns
df.loc[:,'wendu_type']=df.apply(get_wendu_type,axis=1)
# 产看温度类型的计数
df['wendu_type'].value_counts()
常温 3730
高温 231
低温 45
Name: wendu_type, dtype: int64
- df.assign方法
DataFrame.assign(**kwargs)[source]
Assign new columns to a DataFrame.
Returns a new object with all original columns in addition to new ones. Existing columns that are re-assigned will be overwritten.
实例:将温度从摄氏度变为华氏度
# 可以同时添加多个新的列
df.assign(
华氏度最高温=lambda x:x['最高温']*9/5+32,
华氏度最低温=lambda x:x['最低温']*9/5+32,
)
<tr style="text-align: right;">
<th></th>
<th>日期</th>
<th>最高温</th>
<th>最低温</th>
<th>天气</th>
<th>风力风向</th>
<th>空气质量指数</th>
<th>wencha</th>
<th>wendu_type</th>
<th>华氏度最高温</th>
<th>华氏度最低温</th>
</tr>
<tr>
<th>0</th>
<td>2011-01-01 周六</td>
<td>-2</td>
<td>-7</td>
<td>多云~阴</td>
<td>无持续风向微风</td>
<td>NaN</td>
<td>5</td>
<td>常温</td>
<td>28.4</td>
<td>19.4</td>
</tr>
<tr>
<th>1</th>
<td>2011-01-02 周日</td>
<td>-2</td>
<td>-7</td>
<td>多云</td>
<td>无持续风向微风</td>
<td>NaN</td>
<td>5</td>
<td>常温</td>
<td>28.4</td>
<td>19.4</td>
</tr>
<tr>
<th>2</th>
<td>2011-01-03 周一</td>
<td>-2</td>
<td>-6</td>
<td>多云~阴</td>
<td>西北风~北风3-4级~4-5级</td>
<td>NaN</td>
<td>4</td>
<td>常温</td>
<td>28.4</td>
<td>21.2</td>
</tr>
<tr>
<th>3</th>
<td>2011-01-04 周二</td>
<td>-2</td>
<td>-9</td>
<td>晴</td>
<td>北风5-6级</td>
<td>NaN</td>
<td>7</td>
<td>常温</td>
<td>28.4</td>
<td>15.8</td>
</tr>
<tr>
<th>4</th>
<td>2011-01-05 周三</td>
<td>-2</td>
<td>-10</td>
<td>晴</td>
<td>北风~无持续风向3-4级~微风</td>
<td>NaN</td>
<td>8</td>
<td>常温</td>
<td>28.4</td>
<td>14.0</td>
</tr>
<tr>
<th>...</th>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<th>4001</th>
<td>2021-12-27 周一</td>
<td>6</td>
<td>-8</td>
<td>晴</td>
<td>西北风1级</td>
<td>56 良</td>
<td>14</td>
<td>常温</td>
<td>42.8</td>
<td>17.6</td>
</tr>
<tr>
<th>4002</th>
<td>2021-12-28 周二</td>
<td>6</td>
<td>-5</td>
<td>多云~晴</td>
<td>西北风1级</td>
<td>64 良</td>
<td>11</td>
<td>常温</td>
<td>42.8</td>
<td>23.0</td>
</tr>
<tr>
<th>4003</th>
<td>2021-12-29 周三</td>
<td>5</td>
<td>-5</td>
<td>晴</td>
<td>西北风3级</td>
<td>43 优</td>
<td>10</td>
<td>常温</td>
<td>41.0</td>
<td>23.0</td>
</tr>
<tr>
<th>4004</th>
<td>2021-12-30 周四</td>
<td>6</td>
<td>-7</td>
<td>晴</td>
<td>西北风3级</td>
<td>38 优</td>
<td>13</td>
<td>常温</td>
<td>42.8</td>
<td>19.4</td>
</tr>
<tr>
<th>4005</th>
<td>2021-12-31 周五</td>
<td>5</td>
<td>-7</td>
<td>晴</td>
<td>东北风1级</td>
<td>44 优</td>
<td>12</td>
<td>常温</td>
<td>41.0</td>
<td>19.4</td>
</tr>
4006 rows × 10 columns
-
按条件选择分组分别赋值
按条件先选择数据,然后对这部分数据赋值新列
实例:高低温差大于10度,则认为温差大先创建空列(这是第一种创建新列的方法)
df['wencha_type']=''
df.loc[df['最高温']-df['最低温']>10,'wencha_type']='温差大'
df.loc[df['最高温']-df['最低温']<=10,'wencha_type']='温差正常'df['wencha_type'].value_counts()
温差正常 2099
温差大 1907
Name: wencha_type, dtype: int64