Pandas新增数据列V1,后面出V2了,这个可以不用看了

直接赋值,apply,assgin,分条件赋值

  • pandas怎样新增数据列?
  • 在进行数据分析时,经常需要按照一定条件创建新的数据列,然后进行进一步分析

1. 直接赋值

2. df.apply方法

3. df.assgin方法

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

import pandas as pd

0. 读取csv数据到dataframe

file_path = r'C:\TELCEL_MEXICO_BOT\A\Weather.csv'
df = pd.read_csv(file_path,encoding='utf-8')

print(df.head()) #df.head()先读取数据有前5行
        ymd bWendu yWendu tianqi fengxiang fengji  aqi aqiInfo  aqiLevel
0  1/1/2025  -25°C   -6°C   晴~多云       西北风   1-2级   59       优         2
1  1/2/2025    2°C   -9°C      阴       东南风   3-4级   48       优         1
2  1/3/2025  -11°C   -2°C   晴~多云        西风   4-8级   28       良         1
3  1/4/2025    0°C   -4°C   晴~多云        东风   2-5级   30       良         1
4  1/5/2025    3°C   -1°C     小雨        东风   3-5级   25       良         1

1. 直接赋值的方法

例子:清理温度列,变成数字类型. 修改列数据

  • 替换掉温度的后缀°C
  • df.loc[:,'bWendu'] 中的 : 表示选择这个df中所有的行,并同时选择bWendu这一列,让它等于温度bWendu这一列的str形式,然后调用str中的replace方法,把字符串后缀°C替换成空,最后转换下它的类型,变成int32
df.loc[:,'bWendu'] = df['bWendu'].str.replace('°C','').astype('int32')
df.loc[:,'yWendu'] = df['yWendu'].str.replace('°C','').astype('int32')
print(df.head())

          bWendu  yWendu tianqi fengxiang fengji  aqi aqiInfo  aqiLevel
ymd                                                                    
1/1/2025     -25      -6   晴~多云       西北风   1-2级   59       优         2
1/2/2025       2      -9      阴       东南风   3-4级   48       优         1
1/3/2025     -11      -2   晴~多云        西风   4-8级   28       良         1
1/4/2025       0      -4   晴~多云        东风   2-5级   30       良         1
1/5/2025       3      -1     小雨        东风   3-5级   25       良         1
  • 计算温差
  • 注意:df['bWendu']其实是一个Series,后面的减法返回的是Series

例子:新增列wencha 等于bWendu减去yWendu

df.loc[:,'wencha'] = df['bWendu'] - df['yWendu']
print(df.head())
          bWendu  yWendu tianqi fengxiang fengji  aqi aqiInfo  aqiLevel  wencha
ymd                                                                            
1/1/2025     -25      -6   晴~多云       西北风   1-2级   59       优         2     -19
1/2/2025       2      -9      阴       东南风   3-4级   48       优         1      11
1/3/2025     -11      -2   晴~多云        西风   4-8级   28       良         1      -9
1/4/2025       0      -4   晴~多云        东风   2-5级   30       良         1       4
1/5/2025       3      -1     小雨        东风   3-5级   25       良         1       4

2. df.apply方法

例子:添加一列温度类型:

1.如果最高温度大于33度就是高温

2.低于-10度就是低温

3.否则是常温

def get_wendu_type(x):
    if x['bWendu'] > 33:
        return '高温'
    if x['bWendu'] < -10:
        return '低温'
    return '常温'
#注意需要设置axis==1,这是series的index是columns
df.loc[:,'wendu_type'] = df.apply(get_wendu_type,axis=1)

#查看温度类型的计数
print(df['wendu_type'].value_counts())

常温    14
低温     5
Name: wendu_type, dtype: int64

3. df.assgin方法

例子:将温度从摄氏度变成华氏度

#可以同时添加多个新的列

huashi = df.assign(
    yWendu_huashi = lambda x : x['yWendu'] * 9 / 5 + 32,
    bWendu_huashi = lambda x : x['bWendu'] * 9 / 5 + 32
)
print(huashi)
          bWendu  yWendu tianqi  ... wendu_type yWendu_huashi  bWendu_huashi
ymd                               ...                                        
1/1/2025      -25      -6   晴~多云  ...         低温          21.2          -13.0
1/2/2025        2      -9      阴  ...         常温          15.8           35.6
1/3/2025      -11      -2   晴~多云  ...         低温          28.4           12.2
1/4/2025        0      -4   晴~多云  ...         常温          24.8           32.0
1/5/2025        3      -1     小雨  ...         常温          30.2           37.4
1/6/2025       10       3      阴  ...         常温          37.4           50.0
1/7/2025        7     -10      阴  ...         常温          14.0           44.6
1/8/2025      -13      -6     小雨  ...         低温          21.2            8.6
1/9/2025        8      -9   晴~多云  ...         常温          15.8           46.4
1/10/2025       3      -2     阵雨  ...         常温          28.4           37.4
1/11/2025       5      -4     阵雨  ...         常温          24.8           41.0
1/12/2025       7      -1      冰  ...         常温          30.2           44.6
1/13/2025       2      -4      冰  ...         常温          24.8           35.6
1/14/2025     -14      -1      霜  ...         低温          30.2            6.8
1/15/2025       7      -9      霜  ...         常温          15.8           44.6
1/16/2025       5     -10      冰  ...         常温          14.0           41.0
1/17/2025     -19      -6      雾  ...         低温          21.2           -2.2
1/18/2025       3      -9      雾  ...         常温          15.8           37.4
1/19/2025       1      -2      雾  ...         常温          28.4           33.8

[19 rows x 12 columns]

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

按条件先选择数据,然后对这部分数据赋值新列

例子:高低温度差大于10度,则认为温差大

import pandas as pd import numpy as np import os # 读取Excel文件数据 file_path = r"C:\Users\80401\Desktop\date.xlsx" df = pd.read_excel(file_path, sheet_name='100-1') # 提取入库洪水流量数据 Q = df['入库洪水流量Q'].values # 入库洪水流量,单位为m³/s # 初始参数 dt = float(3600) # 时间间隔为3600秒(1小时) q1 = float(3366) # 初始流量,单位为立方米/秒 V1_initial = float(195.59) * 1000000 V2_guess = float(199) * 1000000 V_min = float(66.24) * 1000000 V_max = float(922) * 1000000 # 查找 q=f(V) 表格数据(单位为百万立方米) v_q_table = [ (3.68 * 1000000, 0), (7.07 * 1000000, 280), (13.1 * 1000000, 545), (22.54 * 1000000, 780), (36.33 * 1000000, 1050), (55.06 * 1000000, 1375), (78.71 * 1000000, 1740), (107.51 * 1000000, 2210), (141.73 * 1000000, 2700), (185.65 * 1000000, 3270), (240.4 * 1000000, 3795), (301.86 * 1000000, 4390), (371.11 * 1000000, 4960), (449.24 * 1000000, 5630), (535.86 * 1000000, 6125), (631.76 * 1000000, 6450), (736.32 * 1000000, 6647), (850 * 1000000, 6945), (973 * 1000000, 7231) ] # 查表函数 def lookup_q(V2, table=v_q_table): for i in range(len(table) - 1): if table[i][0] <= V2 <= table[i + 1][0]: q1_table, q2_table = table[i][1], table[i + 1][1] v1_table, v2_table = table[i][0], table[i + 1][0] q_new = q1_table + (q2_table - q1_table) * (V2 - v1_table) / (v2_table - v1_table) return q_new return table[-1][1] # 如果超过最大,返回最后一个 # 结果存储表 results = [] def iterative_v2_solver(V1, V2_guess, V_min, V_max, Q1, Q2, q1, dt, tolerance=0.01, max_iterations=100000): iterations = 0 V2 = V2_guess for i in range(max_iterations): iterations += 1 # 使用当前假设V2,根据水量平衡计算q2 dV = V1 - V2 q2 = (Q1 + Q2 - q1 + 2 * dV / dt) # 使用q = f(V)查表法计算q2_new q2_new = lookup_q(V2) # 检查收敛条件 if abs(q2_new - q2) < tolerance: return V2, q2 # 调整当前假设V2 # 如果假设V2区间,则向边界方向调整 if V2 < V_min or V2 > V_max: V2 = max(V_min, min(V_max, V2)) else: step = (q2 - q2_new) * dt / 2 V2 += step * 0.1 # 达到最大迭代次数仍未收敛 raise ValueError(f"未能在{max_iterations}次迭代内收敛") # 主循环 V1 = V1_initial # 第一个时段的V1 for i in range(len(Q) - 2): # 遍历每个时段 Q1 = Q[i + 1] Q2 = Q[i + 2] try: V2, q2 = iterative_v2_solver(V1, V2_guess, V_min, V_max, Q1, Q2, q1, dt) results.append((V2 / 1000000, q2)) # 存储结果时将V2换算回百万立方米单位 q1 = q2 # 更新下一个时段的q1为上个时段的q2 V1 = V2 # 更新下一个时段的V1为上个时段的V2 except ValueError as e: print(e) # 创建结果DataFrame results_df = pd.DataFrame(results, columns=['水库存水量V2', '下泄流量q2']) # 设置桌面路径 desktop_path = os.path.join(os.path.expanduser("~"), "Desktop") output_path = os.path.join(desktop_path, "水库调度计算结果.xlsx") # 保存到Excel文件 with pd.ExcelWriter(output_path, engine='openpyxl') as writer: # 写入结果数据 results_df.to_excel(writer, sheet_name='计算结果', index=False) print(f"计算完成!结果已保存到: {output_path}") #读取'Q'的长度 # import pandas as pd # # # 读取Excel文件数据 # file_path = r"C:\Users\80401\Desktop\date.xlsx" # df = pd.read_excel(file_path, sheet_name='100-1') # # # 提取入库洪水流量数据 # Q = df['入库洪水流量Q'].values # 入库洪水流量,单位为m³/s # # # 计算lenQ # lenQ = len(Q) # print(f"lenQ的是: {lenQ}") # # for i in range(len(Q) - 2): # 遍历每个时段 # Q1 = Q[i + 1] # Q2 = Q[i + 2] # print(Q1,Q2) 根据文件中的表格,更改上述代码,要求输结果中增加一数据“水库水位Z”,每一个时段的Z仿照上述代码中的查表过程得到
最新发布
06-28
为了满足你的需求,我们需要在代码中增加一个查表函数来查找每个时段对应的水库水位 $Z$,并将这些添加到结果数据框中。以下是完整的改进代码: ### 改进后的代码 ```python import pandas as pd import numpy as np import os # 读取Excel文件数据 file_path = r"C:\Users\80401\Desktop\date.xlsx" df = pd.read_excel(file_path, sheet_name='100-1') # 提取入库洪水流量数据 Q = df['入库洪水流量Q'].values # 入库洪水流量,单位为m³/s # 初始参数 dt = float(3600) # 时间间隔为3600秒(1小时) q1 = float(3366) # 初始流量,单位为立方米/秒 V1_initial = float(195.59) * 1000000 V2_guess = float(199) * 1000000 V_min = float(66.24) * 1000000 V_max = float(922) * 1000000 # 查找 q=f(V) 表格数据(单位为百万立方米) v_q_table = [ (3.68 * 1000000, 0, 92), (7.07 * 1000000, 280, 93), (13.1 * 1000000, 545, 94), (22.54 * 1000000, 780, 95), (36.33 * 1000000, 1050, 96), (55.06 * 1000000, 1375, 97), (78.71 * 1000000, 1740, 98), (107.51 * 1000000, 2210, 99), (141.73 * 1000000, 2700, 100), (185.65 * 1000000, 3270, 101), (240.4 * 1000000, 3795, 102), (301.86 * 1000000, 4390, 103), (371.11 * 1000000, 4960, 104), (449.24 * 1000000, 5630, 105), (535.86 * 1000000, 6125, 106), (631.76 * 1000000, 6450, 107), (736.32 * 1000000, 6647, 108), (850 * 1000000, 6945, 109), (973 * 1000000, 7231, 110) ] # 查表函数,查找q和Z def lookup_q_and_z(V2, table=v_q_table): for i in range(len(table) - 1): if table[i][0] <= V2 <= table[i + 1][0]: q1_table, q2_table = table[i][1], table[i + 1][1] z1_table, z2_table = table[i][2], table[i + 1][2] v1_table, v2_table = table[i][0], table[i + 1][0] q_new = q1_table + (q2_table - q1_table) * (V2 - v1_table) / (v2_table - v1_table) z_new = z1_table + (z2_table - z1_table) * (V2 - v1_table) / (v2_table - v1_table) return q_new, z_new return table[-1][1], table[-1][2] # 如果超过最大,返回最后一个 # 结果存储表 results = [] def iterative_v2_solver(V1, V2_guess, V_min, V_max, Q1, Q2, q1, dt, tolerance=0.01, max_iterations=100000): iterations = 0 V2 = V2_guess for i in range(max_iterations): iterations += 1 # 使用当前假设V2,根据水量平衡计算q2 dV = V1 - V2 q2 = (Q1 + Q2 - q1 + 2 * dV / dt) # 使用q = f(V)查表法计算q2_new q2_new, z2_new = lookup_q_and_z(V2) # 检查收敛条件 if abs(q2_new - q2) < tolerance: return V2, q2, z2_new # 调整当前假设V2 # 如果假设V2区间,则向边界方向调整 if V2 < V_min or V2 > V_max: V2 = max(V_min, min(V_max, V2)) else: step = (q2 - q2_new) * dt / 2 V2 += step * 0.1 # 达到最大迭代次数仍未收敛 raise ValueError(f"未能在{max_iterations}次迭代内收敛") # 主循环 V1 = V1_initial # 第一个时段的V1 for i in range(len(Q) - 2): # 遍历每个时段 Q1 = Q[i + 1] Q2 = Q[i + 2] try: V2, q2, z2 = iterative_v2_solver(V1, V2_guess, V_min, V_max, Q1, Q2, q1, dt) results.append((V2 / 1000000, q2, z2)) # 存储结果时将V2换算回百万立方米单位 q1 = q2 # 更新下一个时段的q1为上个时段的q2 V1 = V2 # 更新下一个时段的V1为上个时段的V2 except ValueError as e: print(e) # 创建结果DataFrame results_df = pd.DataFrame(results, columns=['水库存水量V2', '下泄流量q2', '水库水位Z']) # 设置桌面路径 desktop_path = os.path.join(os.path.expanduser("~"), "Desktop") output_path = os.path.join(desktop_path, "水库调度计算结果.xlsx") # 保存到Excel文件 with pd.ExcelWriter(output_path, engine='openpyxl') as writer: # 写入结果数据 results_df.to_excel(writer, sheet_name='计算结果', index=False) print(f"计算完成!结果已保存到: {output_path}") ``` ### 代码解析 1. **查表函数更新**: - 新增了`lookup_q_and_z`函数,同时查找$q$和$Z$。 - 使用线性插法计算中间,确保结果更准确。 2. **主循环更新**: - 在每次迭代计算完成后,除了存储$V2$和$q2$外,还存储对应的水库水位$Z$。 3. **结果存储**: - 最终的结果存储在`results`表中,并在创建结果DataFrame时增加了水库水位$Z$。 ### 知识点 1. **线性插**: - 线性插法用于估计两个已知数据点之间的未知点,确保插结果平滑准确。 - 示例:`q_new = q1_table + (q2_table - q1_table) * (V2 - v1_table) / (v2_table - v1_table)` 2. **数据存储与处理**: - 使用Pandas DataFrame存储和处理多维数据,便于后续分析和导。 - 数据为Excel文件,方便查看和分享。 3. **异常处理**: - 使用`try-except`块处理可能的迭代不收敛情况,确保代码的鲁棒性。 - 异常处理能够及时反馈问题并继续执行其他计算。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值