Python百例-21~30

本文通过21~30个Python实例,涵盖了while-break、while-continue、for循环、range用法、斐波那契数列、九九乘法表、列表解析、三局两胜游戏、文件基础操作和文件拷贝等内容,深入浅出地讲解了Python的循环控制和文件操作。

21-while-break

break是结束循环,break之后、循环体内代码不再执行。

while True:
    yn = input('Continue(y/n): ')
    if yn in ['n', 'N']:
        break
    print('running...')

22-while-continue

计算100以内偶数之和。
continue是跳过本次循环剩余部分,回到循环条件处。

sum100 = 0
counter = 0

while counter < 100:
    counter += 1
    # if counter % 2:
    if counter % 2 == 1:
        continue
    sum100 += counter

print(sum100)

23-for循环遍历数据对象

astr = 'hello'
alist = [10, 20, 30]
atuple = ('bob', 'tom', 'alice')
adict = {
   
   'name': 'john', 'age': 23}

for ch in astr:
    print(ch)

for i in alist:
    print(i)

for name in atuple:
    print(name)

for key in adict:
    print('%s: %s' % (key, adict[key]))

24-range用法及数字累加

# range(10)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# >>> list(range(10))
# range(6, 11)  # [6, 7, 8, 9, 10]
# range(1, 10, 2)  # [1, 3, 5, 7, 9]
# range(10, 0, -1)  # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
sum100 = 0

for
customerID gender SeniorCitizen ... MonthlyCharges TotalCharges Churn 0 7590-VHVEG Female 0 ... 29.85 29.85 No 1 5575-GNVDE Male 0 ... 56.95 1889.5 No 2 3668-QPYBK Male 0 ... 53.85 108.15 Yes [3 rows x 21 columns] <class 'pandas.core.frame.DataFrame'> RangeIndex: 7043 entries, 0 to 7042 Data columns (total 21 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 customerID 7043 non-null object 1 gender 7043 non-null object 2 SeniorCitizen 7043 non-null int64 3 Partner 7043 non-null object 4 Dependents 7043 non-null object 5 tenure 7043 non-null int64 6 PhoneService 7043 non-null object 7 MultipleLines 7043 non-null object 8 InternetService 7043 non-null object 9 OnlineSecurity 7043 non-null object 10 OnlineBackup 7043 non-null object 11 DeviceProtection 7043 non-null object 12 TechSupport 7043 non-null object 13 StreamingTV 7043 non-null object 14 StreamingMovies 7043 non-null object 15 Contract 7043 non-null object 16 PaperlessBilling 7043 non-null object 17 PaymentMethod 7043 non-null object 18 MonthlyCharges 7043 non-null float64 19 TotalCharges 7043 non-null object 20 Churn 7043 non-null object dtypes: float64(1), int64(2), object(18) memory usage: 1.1+ MB None Traceback (most recent call last): File "E:\python\pythonProject2\Python编程实战100例\Pandas练习100例\39.电信客户流失-查看字段相关性矩阵.py", line 12, in <module> print(df.corr()) ^^^^^^^^^ File "C:\Users\xiaomi\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\core\frame.py", line 10704, in corr mat = data.to_numpy(dtype=float, na_value=np.nan, copy=False) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\xiaomi\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\core\frame.py", line 1889, in to_numpy result = self._mgr.as_array(dtype=dtype, copy=copy, na_value=na_value) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\xiaomi\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\core\internals\managers.py", line 1656, in as_array arr = self._interleave(dtype=dtype, na_value=na_value) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\xiaomi\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\core\internals\managers.py", line 1715, in _interleave result[rl.indexer] = arr ~~~~~~^^^^^^^^^^^^ ValueError: could not convert string to float: '7590-VHVEG'
最新发布
07-24
<think>我们有一个问题:在Pandas DataFrame上使用`df.corr()`计算相关性矩阵时遇到错误`ValueError: could not convert string to float`。 根据错误信息,这通常是因为DataFrame中包含非数值类型的列,而`corr()`方法只能用于数值列。 解决方案: 1. 检查DataFrame的各列数据类型,确保只包含数值类型(如int, float)的数据。 2. 如果存在非数值列,我们需要将其排除或者转换为数值类型(如果合适的话)。 根据引用[1]和[2]中的信息,我们知道当DataFrame中包含字符串(object类型)时,尝试将其转换为float可能会失败,特别是当字符串不能直接转换为数字时(例如包含字母、符号等)。 步骤: 1. 使用`df.dtypes`查看各列的数据类型,识别非数值列。 2. 选择数值列子集进行相关性计算,或者将非数值列转换为数值类型(例如通过编码,如独热编码或标签编码,但注意相关性通常用于连续数值,分类变量需要适当处理)。 具体操作: 方法1:只选择数值列 numerical_df = df.select_dtypes(include=['int64', 'float64']) corr_matrix = numerical_df.corr() 方法2:如果非数值列实际上是分类变量,我们可以考虑将其转换为数值表示(例如使用`pd.factorize`或`OneHotEncoder`),但要注意,这样处理后的变量可能不适合直接计算皮尔逊相关系数(因为皮尔逊相关系数衡量的是线性关系,对于分类变量,我们可能需要使用其他方法,如卡方检验、Cramer's V等)。如果仍然想用`corr()`,则可以将分类变量转换为虚拟变量(哑变量),然后与数值列一起计算相关性。 但是,请注意,虚拟变量是0/1变量,可以与数值变量一起计算相关系数,但这样得到的矩阵可能包含分类变量与连续变量之间的点二列相关系数(当其中一个变量是二分类时)。 根据引用[3],我们还可以通过分组等操作来处理数据,但这里的问题主要是数据类型不匹配。 因此,我们首先尝试只选择数值列来计算相关性。 如果用户的数据集中有些列看起来是数值但被识别为字符串(如引用[1]和[2]中所示),我们需要将这些字符串转换为浮点数。但要注意,如果字符串中包含非数字字符(如引用[2]中的'LTC-USDT'),则转换会失败。对于这种情况,我们需要先清理数据(例如,提取数字部分)或删除这些列。 所以,步骤总结: 1. 检查数据类型:`df.dtypes` 2. 转换可能的数值字符串:如果某些列是字符串但实际应该是数值,尝试使用`pd.to_numeric`(如果转换失败,可以设置`errors='coerce'`将无法转换的设为NaN,但这可能会引入缺失值,需要后续处理)。 3. 排除非数值列:使用`select_dtypes`选择数值列。 示例代码: ```python # 首先,尝试将可能为数值的字符串列转换为数值 # 但注意:我们只对看起来是数值的列做转换,或者先尝试转换所有object列(但可能包含非数值) # 方法:遍历每个object列,尝试转换为数值 for col in df.columns: if df[col].dtype == 'object': try: df[col] = pd.to_numeric(df[col]) except: pass # 如果转换失败,保持原样 # 然后,选择数值列 numerical_df = df.select_dtypes(include=['number']) # 计算相关性 corr_matrix = numerical_df.corr() ``` 但是,上面的转换可能会忽略一些实际上可以转换的列(例如,有些字符串列可能包含逗号或百分号,需要先预处理)。如果转换失败,我们可以考虑更复杂的数据清洗。 如果用户的数据集中包含无法转换为数值的非数值列(如分类文本),那么最好的办法是排除它们。 生成相关问题: 1. 如何将Pandas DataFrame中的字符串列转换为数值列? 2. 如何处理相关性计算中的分类变量? 3. 除了`corr()`,Pandas中还有哪些计算相关性的方法? 4. 如何可视化相关性矩阵? 现在,我们按照要求回答用户的问题。</think>### 计算Pandas DataFrame相关性矩阵时处理类型错误 当使用`df.corr()`计算相关性矩阵时出现`ValueError: could not convert string to float`错误,根本原因是DataFrame中存在非数值类型的列。Pandas的`corr()`方法只能处理数值型数据(如int、float等),遇到字符串或对象类型时会报错[^2]。以下是解决方案: #### 🛠️ 解决方法 1. **检查数据类型**: ```python print(df.dtypes) # 查看各列数据类型 ``` 输出示例: ``` col1 object # 问题列 col2 float64 col3 int64 ``` 2. **筛选数值列再计算**(推荐): ```python # 方法1:自动选择数值列 numerical_df = df.select_dtypes(include=['int64', 'float64']) correlation_matrix = numerical_df.corr() # 方法2:手动选择数值列 correlation_matrix = df[['age', 'income', 'score']].corr() ``` 3. **转换可数值化的字符串列**: ```python # 仅转换能转为数字的列(如"1.2") df['price'] = pd.to_numeric(df['price'], errors='coerce') # 转换失败设为NaN df = df.dropna() # 删除包含NaN的行 correlation_matrix = df.corr() ``` 4. **处理分类变量**: ```python # 使用独热编码转换分类变量(如性别、地区) df_encoded = pd.get_dummies(df, columns=['category_col']) correlation_matrix = df_encoded.corr() ``` #### ⚠️ 注意事项 1. **避免强制转换**: 类似`df = df.astype(float)`的强制转换会直接失败(如引用[2]中的`LTC-USDT`无法转为float)[^2]。 2. **特殊字符处理**: 若数据包含`$1,000`或`10%`等符号,需先清洗: ```python df['revenue'] = df['revenue'].str.replace('$', '').str.replace(',', '').astype(float) ``` 3. **分组计算**: 如需按类别分组计算相关性(如引用[3]),先筛选数值列: ```python df.groupby('region')[['sales', 'profit']].corr() ``` #### 💡 示例代码 ```python import pandas as pd # 含字符串列的示例数据 data = {'age': [25, 30, '35'], # 字符串型数值 'income': ['50,000', '60K', 70000], # 含特殊字符 'gender': ['M', 'F', 'M']} # 分类变量 df = pd.DataFrame(data) # 清洗数据 df['age'] = pd.to_numeric(df['age'], errors='coerce') df['income'] = df['income'].str.replace('K', '000').str.replace(',', '').astype(float) df = pd.get_dummies(df, columns=['gender']) # 分类变量编码 # 安全计算相关性 corr_matrix = df.corr() print(corr_matrix) ``` #### 📌 关键点总结 | 问题类型 | 解决方案 | |------------------|------------------------------| | 纯字符串列 | 直接排除(如用户ID、名称) | | 可数值化的字符串 | 用`pd.to_numeric`转换 | | 分类变量 | 独热编码(`pd.get_dummies`)| | 特殊格式数值 | 正则清洗后转换 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值