使用Pandas对DataFrame进行列属性操作

80 阅读3分钟

根据请求天气网站获取的天气数据

日期,天气状况,气温,风力风向
2023-01-01,多云/阴,8℃/3℃,东风1-2级/东北风1-2级
2023-01-02,阴/多云,9℃/0℃,东北风1-2级/东风1-2级
2023-01-03,多云/多云,9℃/0℃,东风1-2级/东风1-2级
2023-01-04,多云/多云,12℃/1℃,东风3-4级/东南风1-2级
2023-01-05,多云/多云,13℃/3℃,东北风1-2级/西风1-2级
2023-01-06,晴/晴,14℃/0℃,西风3-4级/西风1-2级
2023-01-07,晴/晴,16℃/4℃,西南风1-2级/东南风1-2级
2023-01-08,晴/晴,19℃/3℃,南风1-2级/东北风1-2级
2023-01-09,晴/晴,16℃/3℃,东北风3-4级/东北风3-4级
2023-01-10,多云/多云,12℃/4℃,东风1-2级/东风1-2级
import pandas as pd


def tianqi_bai(x):
    return x["天气状况"].split("/")[0]


def tianqi_hei(x):
    return x["天气状况"].split("/")[1]


if __name__ == '__main__':
    file_path = "weather_nanjing_2023.csv"
    df = pd.read_csv(file_path)
    # 修改索引
    df.set_index("日期", inplace=True)
    # 修改整列的值
    df.loc[:, "气温"] = df["气温"].str.replace("℃", "")
    # 新增列
    # 第1种方式 : 直接赋值
    df.loc[:, "最高气温"] = df["气温"].str.split("/").str.get(0)
    df.loc[:, "最低气温"] = df["气温"].str.split("/").str.get(1)
    # 第2种方式 apply方法 (axis=1 列属性; axis=0 行属性)
    df.loc[:, "白天天气"] = df.apply(tianqi_bai, axis=1)
    df.loc[:, "夜间天气"] = df.apply(tianqi_hei, axis=1)
    # 第3种方式
    df = df.assign(
        白天风力风向=lambda x: x["风力风向"].str.split("/").str.get(0),
        夜间风力风向=lambda x: x["风力风向"].str.split("/").str.get(1)
    )
    df = df.assign(
        白天风向=lambda x: x["白天风力风向"].str.split("风").str.get(0) + "风",
        白天风力=lambda x: x["白天风力风向"].str.split("风").str.get(1),
        夜间风向=lambda x: x["夜间风力风向"].str.split("风").str.get(0) + "风",
        夜间风力=lambda x: x["夜间风力风向"].str.split("风").str.get(1),
    )
    # 删除列 axis=1
    df = df.drop(['天气状况', '气温', '风力风向', '白天风力风向', '夜间风力风向'], axis=1)
    print(df.head())
    # 对某一列数据进行分组计数
    # print(df["白天天气"].value_counts())
    df.to_csv("weather_nanjing_2023_transfer.csv")

结果如下所示:

日期,最高气温,最低气温,白天天气,夜间天气,白天风向,白天风力,夜间风向,夜间风力
2023-01-01,8,3,多云,阴,东风,1-2级,东北风,1-2级
2023-01-02,9,0,阴,多云,东北风,1-2级,东风,1-2级
2023-01-03,9,0,多云,多云,东风,1-2级,东风,1-2级
2023-01-04,12,1,多云,多云,东风,3-4级,东南风,1-2级
2023-01-05,13,3,多云,多云,东北风,1-2级,西风,1-2级
2023-01-06,14,0,晴,晴,西风,3-4级,西风,1-2级
2023-01-07,16,4,晴,晴,西南风,1-2级,东南风,1-2级
2023-01-08,19,3,晴,晴,南风,1-2级,东北风,1-2级
2023-01-09,16,3,晴,晴,东北风,3-4级,东北风,3-4级
2023-01-10,12,4,多云,多云,东风,1-2级,东风,1-2级