(一)python循环基础
1.for 循环 - 基本形式
# 使用 range() 函数生成一系列数字
for i in range(5):
print(i)
0
1
2
3
4
2.for 循环 - 遍历列表
# 遍历列表的每个元素
fruits = ["苹果", "橙子", "香蕉"]
for fruit in fruits:
print(fruit)
苹果
橙子
香蕉
3.while 循环 - 基本形式
# 使用 while 循环计数
count = 0
while count < 5:
print(count)
count += 1
0
1
2
3
4
4.嵌套循环 - 打印九九乘法表
for i in range(1, 10):
for j in range(1, 10):
print(f"{i} * {j} = {i*j}", end="\t")
print() # 换行
1 * 1 = 1 1 * 2 = 2 1 * 3 = 3 1 * 4 = 4 1 * 5 = 5 1 * 6 = 6 1 * 7 = 7 1 * 8 = 8 1 * 9 = 9
2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18
3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 3 * 4 = 12 3 * 5 = 15 3 * 6 = 18 3 * 7 = 21 3 * 8 = 24 3 * 9 = 27
4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 4 * 5 = 20 4 * 6 = 24 4 * 7 = 28 4 * 8 = 32 4 * 9 = 36
5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 5 * 6 = 30 5 * 7 = 35 5 * 8 = 40 5 * 9 = 45
6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36 6 * 7 = 42 6 * 8 = 48 6 * 9 = 54
7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49 7 * 8 = 56 7 * 9 = 63
8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64 8 * 9 = 72
9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
5.循环控制语句 - break 和 continue
# 使用 break 在特定条件下终止循环
for i in range(10):
if i == 5:
break
print(i)
# 使用 continue 跳过特定条件下的循环体余下部分
for i in range(10):
if i % 2 == 0:
continue
print(i)
0
1
2
3
4
1
3
5
7
9
(二)python循环案例
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.graph_objects as go
import statsmodels.api as sm
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
import warnings
warnings.filterwarnings("ignore", category=FutureWarning)
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 指定字体
font = FontProperties(fname=r'C:\WINDOWS\Fonts\simhei.ttf') # 请根据你的系统和字体路径修改
# 指定文件路径
file_path = r"D:\PycharmProjects\pythonProject1\Data_func.xlsx"
# 读取Excel文件中的"data" sheet
df = pd.read_excel(file_path, sheet_name="data")
# 根据type的数值生成 0 1 数值
df['transaction_type'] = np.where(df['type'] == 1, 'export', 'import')
# 创建id到字符串的映射
id_mapping = {1: "New York", 2: "Los Angeles", 3: "Tokyo", 4: "Shanghai"}
# 添加新的列'id_str',根据id映射为相应的字符串
df['id_str'] = df['id'].map(id_mapping)
# 创建id_str到洲的映射
continent_mapping = {"New York": 1, "Los Angeles": 1, "Tokyo": 2, "Shanghai": 2}
# 添加新的列'continent',根据id_str映射为相应的洲
df['continent'] = df['id_str'].map(continent_mapping)
# 添加新的列'post',根据条件设置值
df['post'] = (df['year'] > 2012).astype(int)
# 添加新的列'post',根据条件设置值
df['post'] = (df['year'] > 2012).astype(int)
print(df)
year id value type transaction_type id_str continent post
0 2011 1 3.000000 1 export New York 1 0
1 2011 1 6.000000 0 import New York 1 0
2 2011 2 13.000000 1 export Los Angeles 1 0
3 2011 2 19.000000 0 import Los Angeles 1 0
4 2011 3 57.000000 1 export Tokyo 2 0
5 2011 3 51.000000 0 import Tokyo 2 0
6 2011 4 109.000000 1 export Shanghai 2 0
7 2011 4 101.000000 0 import Shanghai 2 0
8 2012 1 4.000000 1 export New York 1 0
9 2012 1 9.000000 0 import New York 1 0
10 2012 2 20.000000 1 export Los Angeles 1 0
11 2012 2 34.000000 0 import Los Angeles 1 0
12 2012 3 68.000000 1 export Tokyo 2 0
13 2012 3 77.000000 0 import Tokyo 2 0
14 2012 4 151.000000 1 export Shanghai 2 0
15 2012 4 164.000000 0 import Shanghai 2 0
16 2013 1 72.280243 1 export New York 1 1
17 2013 1 31.164486 0 import New York 1 1
18 2013 2 32.016239 1 export Los Angeles 1 1
19 2013 2 78.660613 0 import Los Angeles 1 1
20 2013 3 25.595920 1 export Tokyo 2 1
21 2013 3 95.224212 0 import Tokyo 2 1
22 2013 4 92.510777 1 export Shanghai 2 1
23 2013 4 97.412295 0 import Shanghai 2 1
24 2014 1 33.020932 1 export New York 1 1
25 2014 1 27.992993 0 import New York 1 1
26 2014 2 51.596583 1 export Los Angeles 1 1
27 2014 2 50.258884 0 import Los Angeles 1 1
28 2014 3 39.142033 1 export Tokyo 2 1
29 2014 3 47.735438 0 import Tokyo 2 1
30 2014 4 85.551489 1 export Shanghai 2 1
31 2014 4 92.394758 0 import Shanghai 2 1
a.对字符进行循环处理
- 如果不使用循环
# 根据条件对数据进行处理
df['value'] = df.apply(lambda row: row['value'] / 2 if row['id_str'] in ['New York', 'Shanghai'] else row['value'], axis=1)
# 打印处理后的数据
#print(df)
这行代码使用了apply函数和一个匿名函数(lambda函数)来修改DataFrame df中的’value’列。
-
df[‘value’]: 选择DataFrame中的’value’列。
-
df.apply(…): apply函数用于沿着DataFrame的轴应用一个函数。在这里,它沿轴1操作,这意味着它将函数应用于每一行。
-
lambda row: row[‘value’] / 2 if row[‘id_str’] in [‘New York’, ‘Shanghai’] else row[‘value’]: 这是一个匿名函数,接受每一行作为输入。它检查该行’id_str’列的值是否为’New York’或’Shanghai’。如果是,它将’value’除以2;否则,保持’value’不变。
-
axis=1: 指定匿名函数应用于每一行。
因此,这行代码的总体效果是,对于’id_str’是’New York’或’Shanghai’的行,将’value’除以2;对于其他行,保持’value’不变。修改后的’value’列然后被赋值回DataFrame中原始的’value’列。
- 如果使用循环
# 使用循环对数据进行处理
for index, row in df.iterrows():
if row['id_str'] in ['New York', 'Shanghai']:
df.at[index, 'value'] /= 2
# 打印处理后的数据
#print(df)
这段代码使用循环(for循环)来遍历DataFrame中的每一行,并根据特定条件对数据进行处理。
-
for index, row in df.iterrows():: 这是一个for循环,使用iterrows()方法遍历DataFrame df中的每一行。在每次迭代中,index是行索引,row是包含该行数据的Series对象。
-
if row[‘id_str’] in [‘New York’, ‘Shanghai’]:: 这是一个条件语句,检查当前行的’id_str’列是否包含在列表[‘New York’, ‘Shanghai’]中。
-
df.at[index, ‘value’] /= 2: 如果条件为真(‘id_str’是’New York’或’Shanghai’),则执行此行代码。它使用df.at[]方法访问DataFrame中特定位置的值,然后将’value’除以2。这样就实现了对’id_str’为’New York’或’Shanghai’的行的’value’列进行除以2的操作。
b.对数值进行循环处理
# 使用循环对数据进行处理
for index, row in df.iterrows():
if row['year'] > 2011 and row['transaction_type'] == 'export':
df.at[index, 'value'] /= 2
# 循环处理数据
for index, row in df.iterrows():
if row['year'] > 2011:
df.at[index, 'value'] /= 2
# 打印处理后的 DataFrame
print(df)
year id value type transaction_type id_str continent post
0 2011 1 0.750000 1 export New York 1 0
1 2011 1 1.500000 0 import New York 1 0
2 2011 2 13.000000 1 export Los Angeles 1 0
3 2011 2 19.000000 0 import Los Angeles 1 0
4 2011 3 57.000000 1 export Tokyo 2 0
5 2011 3 51.000000 0 import Tokyo 2 0
6 2011 4 27.250000 1 export Shanghai 2 0
7 2011 4 25.250000 0 import Shanghai 2 0
8 2012 1 0.250000 1 export New York 1 0
9 2012 1 1.125000 0 import New York 1 0
10 2012 2 5.000000 1 export Los Angeles 1 0
11 2012 2 17.000000 0 import Los Angeles 1 0
12 2012 3 17.000000 1 export Tokyo 2 0
13 2012 3 38.500000 0 import Tokyo 2 0
14 2012 4 9.437500 1 export Shanghai 2 0
15 2012 4 20.500000 0 import Shanghai 2 0
16 2013 1 4.517515 1 export New York 1 1
17 2013 1 3.895561 0 import New York 1 1
18 2013 2 8.004060 1 export Los Angeles 1 1
19 2013 2 39.330306 0 import Los Angeles 1 1
20 2013 3 6.398980 1 export Tokyo 2 1
21 2013 3 47.612106 0 import Tokyo 2 1
22 2013 4 5.781924 1 export Shanghai 2 1
23 2013 4 12.176537 0 import Shanghai 2 1
24 2014 1 2.063808 1 export New York 1 1
25 2014 1 3.499124 0 import New York 1 1
26 2014 2 12.899146 1 export Los Angeles 1 1
27 2014 2 25.129442 0 import Los Angeles 1 1
28 2014 3 9.785508 1 export Tokyo 2 1
29 2014 3 23.867719 0 import Tokyo 2 1
30 2014 4 5.346968 1 export Shanghai 2 1
31 2014 4 11.549345 0 import Shanghai 2 1
# 循环处理每个年份大于2011的数据
for year in df['year'].unique():
if year > 2011:
mask = df['year'] == year
df.loc[mask, 'value'] /= 2
# 打印处理后的 DataFrame
print(df)
##遍历年份: 使用 df['year'].unique() 获取 DataFrame 中 'year' 列的所有唯一值(独特的年份),然后使用 for year in ... 循环遍历这些年份。
##条件检查: 在循环中,通过 if year > 2011: 进行条件检查,仅处理大于2011的年份对应的数据。
##生成掩码(Mask): 使用 mask = df['year'] == year 创建一个布尔掩码,该掩码标识了 DataFrame 中 'year' 列等于当前循环年份的行。
##数据处理: 使用 df.loc[mask, 'value'] /= 2 对符合条件的行中 'value' 列的值进行除以2的操作。
##打印处理后的 DataFrame: 在循环结束后,使用 print(df) 打印处理后的 DataFrame,以便查看处理结果。
year id value type transaction_type id_str continent post
0 2011 1 0.750000 1 export New York 1 0
1 2011 1 1.500000 0 import New York 1 0
2 2011 2 13.000000 1 export Los Angeles 1 0
3 2011 2 19.000000 0 import Los Angeles 1 0
4 2011 3 57.000000 1 export Tokyo 2 0
5 2011 3 51.000000 0 import Tokyo 2 0
6 2011 4 27.250000 1 export Shanghai 2 0
7 2011 4 25.250000 0 import Shanghai 2 0
8 2012 1 0.125000 1 export New York 1 0
9 2012 1 0.562500 0 import New York 1 0
10 2012 2 2.500000 1 export Los Angeles 1 0
11 2012 2 8.500000 0 import Los Angeles 1 0
12 2012 3 8.500000 1 export Tokyo 2 0
13 2012 3 19.250000 0 import Tokyo 2 0
14 2012 4 4.718750 1 export Shanghai 2 0
15 2012 4 10.250000 0 import Shanghai 2 0
16 2013 1 2.258758 1 export New York 1 1
17 2013 1 1.947780 0 import New York 1 1
18 2013 2 4.002030 1 export Los Angeles 1 1
19 2013 2 19.665153 0 import Los Angeles 1 1
20 2013 3 3.199490 1 export Tokyo 2 1
21 2013 3 23.806053 0 import Tokyo 2 1
22 2013 4 2.890962 1 export Shanghai 2 1
23 2013 4 6.088268 0 import Shanghai 2 1
24 2014 1 1.031904 1 export New York 1 1
25 2014 1 1.749562 0 import New York 1 1
26 2014 2 6.449573 1 export Los Angeles 1 1
27 2014 2 12.564721 0 import Los Angeles 1 1
28 2014 3 4.892754 1 export Tokyo 2 1
29 2014 3 11.933859 0 import Tokyo 2 1
30 2014 4 2.673484 1 export Shanghai 2 1
31 2014 4 5.774672 0 import Shanghai 2 1