pandas.DataFrame.drop 放错标签
pandas.DataFrame.drop dropped wrong label
我正在使用 https://python-graph-gallery.com/391-radar-chart-with-several-individuals/ 中的代码,在我更改了它的一些标签后,它不再工作了。
我有一个数据框:
df = pd.DataFrame({
'group': ['A', 'B', 'C', 'D'],
'var1': [38, 1.5, 30, 4],
'var2': [29, 10, 9, 34],
'var3': [8, 39, 23, 24],
'var4': [7, 31, 33, 14],
'var5': [28, 15, 32, 14]
})
values = df.loc[0].drop('group').values.flatten().tolist()
values += values[:1]
values = df.loc[1].drop('group').values.flatten().tolist()
values += values[:1]
values = df.loc[2].drop('group').values.flatten().tolist()
values += values[:1]
这与网站上的代码完全相同,雷达图正在正确下降 group
。
但是,如果我将 var1
更改为 a
或其他任何内容,它不会正确地删除 group
。
能试的方法都试过了,还是没有解决问题。每当 var2
的名称更改时,它不会删除 group
。请帮我解决或告诉我哪里不对,谢谢!
完整代码:
# Libraries
import matplotlib.pyplot as plt
import pandas as pd
from math import pi
# Set data
df = pd.DataFrame({
'group': ['A', 'B', 'C', 'D'],
'var1': [38, 1.5, 30, 4],
'var2': [29, 10, 9, 34],
'var3': [8, 39, 23, 24], # if you change var3 to asdfs(some random thing), the issue will exist
'var4': [7, 31, 33, 14],
'var5': [28, 15, 32, 14]
})
categories = list(df)[1:]
N = len(categories)
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]
ax = plt.subplot(111, polar=True)
ax.set_theta_offset(pi / 2)
ax.set_theta_direction(-1)
plt.xticks(angles[:-1], categories)
# Draw ylabels
ax.set_rlabel_position(0)
plt.yticks([10, 20, 30], ["10", "20", "30"], color="grey", size=7)
plt.ylim(0, 40)
values = df.loc[0].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid', label="group A")
ax.fill(angles, values, 'b', alpha=0.1)
values = df.loc[1].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid', label="group B")
ax.fill(angles, values, 'r', alpha=0.1)
values = df.loc[1].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid', label="group C")
ax.fill(angles, values, 'r', alpha=0.1)
plt.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1))
plt.show()
问题是,当您删除正确的 值 时,您并不总是删除正确的 名称 。问题出在前几行:
df = pd.DataFrame({
'group': ['A', 'B', 'C', 'D'],
'var1': [38, 1.5, 30, 4],
# ...
})
categories = list(df)[1:]
您从字典构造 DataFrame。并且听写不会像您假设的那样保留您编写它们的顺序。因此 list(df)[1:]
可能包含来自 df
的任意顺序的列名,并删除一个(任意)名称。
一个简单的解决方法是:
categories = df.columns.drop('group').tolist()
但请注意,这可能仍然会给您留下类别似乎随机移动的情节。要控制顺序,这里有一个解决方案:
df = pd.DataFrame.from_items([
('group', ['A', 'B', 'C', 'D']),
('var1', [38, 1.5, 30, 4]),
# ...
])
通过使用列表而不是字典,顺序将被保留,并且 list(df)[1:]
将始终排除 group
。
我正在使用 https://python-graph-gallery.com/391-radar-chart-with-several-individuals/ 中的代码,在我更改了它的一些标签后,它不再工作了。 我有一个数据框:
df = pd.DataFrame({
'group': ['A', 'B', 'C', 'D'],
'var1': [38, 1.5, 30, 4],
'var2': [29, 10, 9, 34],
'var3': [8, 39, 23, 24],
'var4': [7, 31, 33, 14],
'var5': [28, 15, 32, 14]
})
values = df.loc[0].drop('group').values.flatten().tolist()
values += values[:1]
values = df.loc[1].drop('group').values.flatten().tolist()
values += values[:1]
values = df.loc[2].drop('group').values.flatten().tolist()
values += values[:1]
这与网站上的代码完全相同,雷达图正在正确下降 group
。
但是,如果我将 var1
更改为 a
或其他任何内容,它不会正确地删除 group
。
能试的方法都试过了,还是没有解决问题。每当 var2
的名称更改时,它不会删除 group
。请帮我解决或告诉我哪里不对,谢谢!
完整代码:
# Libraries
import matplotlib.pyplot as plt
import pandas as pd
from math import pi
# Set data
df = pd.DataFrame({
'group': ['A', 'B', 'C', 'D'],
'var1': [38, 1.5, 30, 4],
'var2': [29, 10, 9, 34],
'var3': [8, 39, 23, 24], # if you change var3 to asdfs(some random thing), the issue will exist
'var4': [7, 31, 33, 14],
'var5': [28, 15, 32, 14]
})
categories = list(df)[1:]
N = len(categories)
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]
ax = plt.subplot(111, polar=True)
ax.set_theta_offset(pi / 2)
ax.set_theta_direction(-1)
plt.xticks(angles[:-1], categories)
# Draw ylabels
ax.set_rlabel_position(0)
plt.yticks([10, 20, 30], ["10", "20", "30"], color="grey", size=7)
plt.ylim(0, 40)
values = df.loc[0].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid', label="group A")
ax.fill(angles, values, 'b', alpha=0.1)
values = df.loc[1].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid', label="group B")
ax.fill(angles, values, 'r', alpha=0.1)
values = df.loc[1].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid', label="group C")
ax.fill(angles, values, 'r', alpha=0.1)
plt.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1))
plt.show()
问题是,当您删除正确的 值 时,您并不总是删除正确的 名称 。问题出在前几行:
df = pd.DataFrame({
'group': ['A', 'B', 'C', 'D'],
'var1': [38, 1.5, 30, 4],
# ...
})
categories = list(df)[1:]
您从字典构造 DataFrame。并且听写不会像您假设的那样保留您编写它们的顺序。因此 list(df)[1:]
可能包含来自 df
的任意顺序的列名,并删除一个(任意)名称。
一个简单的解决方法是:
categories = df.columns.drop('group').tolist()
但请注意,这可能仍然会给您留下类别似乎随机移动的情节。要控制顺序,这里有一个解决方案:
df = pd.DataFrame.from_items([
('group', ['A', 'B', 'C', 'D']),
('var1', [38, 1.5, 30, 4]),
# ...
])
通过使用列表而不是字典,顺序将被保留,并且 list(df)[1:]
将始终排除 group
。