zl程序教程

您现在的位置是:首页 >  Java

当前栏目

Pandas | 如何新增数据列?

2023-02-18 16:35:08 时间

前言

在数据分析时,原始数据往往不能满足我们的需求,经常需要按照一定条件创建新的数据列或者修改原有数据列,然后进行后续分析。

本次我们将介绍四种新增数据列的方法:直接赋值、df.apply方法、df.assign方法以及按条件筛选后赋值。

本文框架

  • 0. 导入Pandas
  • 1. 读取数据与数据预处理
  • 2. 直接赋值
  • 3. df.apply方法
  • 4. df.assign方法
  • 5. 按条件筛选后赋值

0. 导入Pandas

import pandas as pd

1. 读取数据与数据预处理

# 读取数据
data = pd.read_csv("./datas/04/Weather_2018.csv")
--------------------------------------------------------------------------------
# 查看数据前6行
data.head(6)
# 返回结果
          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
5  2018-01-06     2℃    -5℃   多云~阴       西南风   1-2级   32       优         1
--------------------------------------------------------------------------------
# 替换掉温度的后缀℃
# 先将数据转化成字符串,再将"℃"替换为空,最后再转化为数值
data["bWendu"] = data["bWendu"].str.replace("℃", "").astype("int32")
data["yWendu"] = data["yWendu"].str.replace("℃", "").astype("int32")
--------------------------------------------------------------------------------
# 查看转化后数据框
data.head()
# 返回结果
           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

2. 直接赋值

我们可以通过"df["新列名"] = ……"方式添加新列。

# 计算温差
data["Temperature_difference"] = data["bWendu"] - data["yWendu"]
# 查看添加新列后的数据
data.head()
# 返回结果
          ymd  bWendu  yWendu  ... aqiInfo aqiLevel Temperature_difference
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

3. df.apply方法

使用apply时,通常放入一个 lambda 函数表达式、或一个函数作为操作运算。

在此我们为数据添加"Temperature_type"列,设置最高温度大于30为热,最低气温低于-10为冷,其余为正常。

# 定义函数
def Temperature_type(df):
    if df["bWendu"] > 30:
        return "Hot"
    elif df["yWendu"] < -10:
        return "cold"
    else:
        return "normal"
# apply添加"Temperature_type"列
# axis=1,表示横向操作,增加新的列;axis=0表示竖向操作,是增加新的行
data["Temperature_type"] = data.apply(Temperature_type,axis=1)
--------------------------------------------------------------------------------
# 查看结构
# df.value_counts()计算数据出现的频率
data["Temperature_type"].value_counts()
# 返回结果
normal    286
Hot        71
cold        8
Name: Temperature_type, dtype: int64

4. df.assign方法

①assign赋值新列时,一般用"新列名=表达式"的形式,其中新列名为变量的形式,所以不加引号(加引号时意味着是字符串);

②assign返回创建了新列的dataframe,不会修改原本的dataframe,所以一般需要用新的dataframe对象接收返回值;

③assign不仅可用于创建新的列,也可用于更新已有列,此时创建的新列会覆盖原有列。

这这里,我们将最低气温和最低气温转化为华氏度。

# 添加华氏度列
data.assign( b_Fahrenheit = lambda df : df["bWendu"] * 9 / 5 + 32,
             y_Fahrenheit = lambda df : df["yWendu"] * 9 / 5 + 32)
# 返回结果
            ymd  bWendu  yWendu  ... Temperature_type b_Fahrenheit y_Fahrenheit
0    2018-01-01       3      -6  ...           normal         37.4         21.2
1    2018-01-02       2      -5  ...           normal         35.6         23.0
2    2018-01-03       2      -5  ...           normal         35.6         23.0
3    2018-01-04       0      -8  ...           normal         32.0         17.6
4    2018-01-05       3      -6  ...           normal         37.4         21.2
..          ...     ...     ...  ...        

5. 按条件筛选后赋值

# 创建"Temperature_difference"空列
data["Temperature_difference"] = ''
# 为"Temperature_difference"赋值
data.loc[data["bWendu"]-data["yWendu"]>10,"Temperature_difference"] = "温差大"
data.loc[data["bWendu"]-data["yWendu"]<=10,"Temperature_difference"] = "温差小"
--------------------------------------------------------------------------------
# 查看温差大小频数
data["Temperature_difference"].value_counts()
# 返回结果
温差小    187
温差大    178
Name: Temperature_difference, dtype: int64