如何解决'NoneType' object is not iterable问题?


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

data = {
    '文物编号': ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '16', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56','57','58'],
    '纹饰': ['C', 'A', 'A', 'A', 'A', 'A', 'B', 'C', 'B', 'B', 'C', 'B', 'C', 'C', 'C','A', 'A', 'A', 'A', 'B', 'A', 'C', 'C', 'C', 'B', 'A', 'A', 'A', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C','C', 'A','C', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'C', 'A', 'C','C','C','C','C'],
    '类型': ['高钾', '铅钡', '高钾', '高钾', '高钾', '高钾', '高钾', '铅钡', '高钾', '高钾', '铅钡', '高钾', '高钾', '高钾', '高钾', '高钾', '铅钡', '铅钡', '高钾', '高钾', '铅钡', '铅钡', '铅钡', '铅钡', '高钾', '铅钡', '铅钡', '铅钡','铅钡', '铅钡', '铅钡', '铅钡', '铅钡', '铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡'],
    '颜色': ['蓝绿', '浅蓝', '蓝绿', '蓝绿', '蓝绿', '蓝绿', '蓝绿', '紫', '蓝绿', '蓝绿', '浅蓝', '蓝绿', '浅绿', '深绿',  '浅蓝', '深蓝', 'X','浅蓝', '蓝绿', '蓝绿', '蓝绿', '紫', '浅蓝', '紫', '蓝绿', '浅蓝', '浅蓝', '深蓝', '紫', '浅绿', '深绿', '深绿', '浅绿', '深绿', '深绿', '深绿', '深绿', 'X', '浅绿', '浅蓝', '浅蓝', '浅蓝', '浅蓝', '浅蓝', '浅蓝', 'X', '黑', '黑', '浅蓝','浅蓝','浅蓝','浅蓝','绿','蓝绿','蓝绿','X'],
    '表面风化': ['无风化', '风化', '无风化', '无风化', '无风化', '无风化', '风化', '风化', '风化', '风化', '风化', '风化', '无风化', '无风化', '无风化','无风化', '风化', '无风化', '无风化', '风化', '风化', '无风化', '风化', '风化', '风化', '风化', '风化', '无风化', '无风化', '无风化', '无风化', '风化', '无风化', '风化', '无风化', '风化', '风化', '风化', '风化', '风化', '风化', '风化', '无风化', '无风化', '无风化', '风化', '风化', '风化','风化','风化','风化','风化','无风化','风化','风化','风化']
}

df = pd.DataFrame(data)

df.replace('X', np.nan, inplace=True)

plt.figure(figsize=(10, 6))
sns.lineplot(data=df[['纹饰', '类型', '颜色']])
plt.title('三线图 - 纹饰、类型、颜色的关系')
plt.xlabel('文物编号')
plt.ylabel('属性值')
plt.xticks(rotation=45)
plt.legend(title='属性')
plt.tight_layout()
plt.show()

plt.figure(figsize=(10, 6))
sns.scatterplot(data=df, x='纹饰', y='颜色', hue='表面风化', style='类型', palette='Set2')
plt.title('散点图 - 纹饰、颜色、表面风化和类型的关系')
plt.xlabel('纹饰')
plt.ylabel('颜色')
plt.legend(title='表面风化')
plt.tight_layout()
plt.show()

为什么会出现 'NoneType' object is not iterable的问题呢?请问如何解决这个问题呢?

我这里测试,将20行的data改了名字为data2,好像就可以了;

然后,增加了一点代码,让pyplot图标显示中文。

修改如下:

参考链接:


python中pyplot图表中文正常显示_pyplot 中文_航院小将的博客-CSDN博客 本人解释器 python 3.7环境,Windows操作系统下:pyplot制图默认不支持中文显示,例如如下代码,图表为# -*- coding:utf-8 -*-# author:qyy time:2019-5-29import matplotlib.pyplot as pltx = [1, 2, 3, 4, 5]# 设置图标标题,并给坐标轴添加标签plt.title..._pyplot 中文 https://blog.csdn.net/qi_yue_yu/article/details/90668030


  
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib

# https://blog.csdn.net/qi_yue_yu/article/details/90668030
# 让pyplot图标显示中文
font = {'family': 'SimHei', "size": 12}
matplotlib.rc('font', **font)  # 一次定义终身使用

data = {
    '文物编号': ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '16', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56','57','58'],
    '纹饰': ['C', 'A', 'A', 'A', 'A', 'A', 'B', 'C', 'B', 'B', 'C', 'B', 'C', 'C', 'C','A', 'A', 'A', 'A', 'B', 'A', 'C', 'C', 'C', 'B', 'A', 'A', 'A', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C','C', 'A','C', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'C', 'A', 'C','C','C','C','C'],
    '类型': ['高钾', '铅钡', '高钾', '高钾', '高钾', '高钾', '高钾', '铅钡', '高钾', '高钾', '铅钡', '高钾', '高钾', '高钾', '高钾', '高钾', '铅钡', '铅钡', '高钾', '高钾', '铅钡', '铅钡', '铅钡', '铅钡', '高钾', '铅钡', '铅钡', '铅钡','铅钡', '铅钡', '铅钡', '铅钡', '铅钡', '铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡','铅钡'],
    '颜色': ['蓝绿', '浅蓝', '蓝绿', '蓝绿', '蓝绿', '蓝绿', '蓝绿', '紫', '蓝绿', '蓝绿', '浅蓝', '蓝绿', '浅绿', '深绿',  '浅蓝', '深蓝', 'X','浅蓝', '蓝绿', '蓝绿', '蓝绿', '紫', '浅蓝', '紫', '蓝绿', '浅蓝', '浅蓝', '深蓝', '紫', '浅绿', '深绿', '深绿', '浅绿', '深绿', '深绿', '深绿', '深绿', 'X', '浅绿', '浅蓝', '浅蓝', '浅蓝', '浅蓝', '浅蓝', '浅蓝', 'X', '黑', '黑', '浅蓝','浅蓝','浅蓝','浅蓝','绿','蓝绿','蓝绿','X'],
    '表面风化': ['无风化', '风化', '无风化', '无风化', '无风化', '无风化', '风化', '风化', '风化', '风化', '风化', '风化', '无风化', '无风化', '无风化','无风化', '风化', '无风化', '无风化', '风化', '风化', '无风化', '风化', '风化', '风化', '风化', '风化', '无风化', '无风化', '无风化', '无风化', '风化', '无风化', '风化', '无风化', '风化', '风化', '风化', '风化', '风化', '风化', '风化', '无风化', '无风化', '无风化', '风化', '风化', '风化','风化','风化','风化','风化','无风化','风化','风化','风化']
}

#df = pd.DataFrame(data,columns=['文物编号','纹饰','类型','颜色','表面风化']) 
df = pd.DataFrame(data)
#print(df)


df.replace('X', np.nan, inplace=True)
 
plt.figure(figsize=(10, 6))

# https://zhuanlan.zhihu.com/p/138789910
sns.lineplot(data2=df[['纹饰', '类型', '颜色']])

# https://blog.csdn.net/qi_yue_yu/article/details/90668030
font = {'family': 'SimHei', "size": 12}
matplotlib.rc('font', **font)  # 一次定义终身使用

plt.title('三线图 - 纹饰、类型、颜色的关系')
plt.xlabel('文物编号')
plt.ylabel('属性值')
plt.xticks(rotation=45)
plt.legend(title='属性')
plt.tight_layout()
plt.show()
 
plt.figure(figsize=(10, 6))
sns.scatterplot(data=df, x='纹饰', y='颜色', hue='表面风化', style='类型', palette='Set2')
plt.title('散点图 - 纹饰、颜色、表面风化和类型的关系')
plt.xlabel('纹饰')
plt.ylabel('颜色')
plt.legend(title='表面风化')
plt.tight_layout()
plt.show()
 

img

【以下回答由 GPT 生成】

这个问题的原因是在使用循环迭代时,data变量的类型是一个字典(dictionary),而字典在迭代时默认只会迭代它的键(keys)。因此在循环迭代data时,实际上只会迭代字典的键,而不是值。

如果你想要迭代字典的值,可以使用data.values()方法:

for item in data.values():
    print(item)

但是,根据你的代码,data是一个包含两个键值对(‘文物编号’和‘纹饰’)的字典。如果你想要同时迭代键和值,可以使用data.items()方法:

for key, value in data.items():
    print(key, value)

这样,你就可以同时获取键和值了。希望这个解决方案对你有帮助。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^