新增数据

在进行数据分析时,经常需要根据一定条件创建新的数据列,然后及逆行进一步分析

  1. 直接赋值

  2. df.apply方法

  3. df.assign方法

  4. 按条件选择分组分别赋值

    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>
  1. 直接赋值

实例:计算温差

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>
  1. 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
  1. 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

  1. 按条件选择分组分别赋值
    按条件先选择数据,然后对这部分数据赋值新列
    实例:高低温差大于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

posted @ 2023-09-05 00:30  慆慢险躁  阅读(17)  评论(0编辑  收藏  举报