pandas.DataFrame.drop删除了错误的标签

时间:2018-04-23 00:29:37

标签: python python-3.x pandas radar-chart

我正在使用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]

这与网站上的代码相同,雷达图正确地删除了groupcorrect radar graph

但是,如果我将var1更改为a或其他任何内容,则不会正确删除groupIncorrect radar

我已尽力尝试,但仍未解决问题。每当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()

1 个答案:

答案 0 :(得分:2)

问题在于,当您删除正确的时,并不总是删除正确的名称。问题出在前几行:

df = pd.DataFrame({
    'group': ['A', 'B', 'C', 'D'],
    'var1': [38, 1.5, 30, 4],
    # ...
})

categories = list(df)[1:]

您从dict构造DataFrame。正如您所假设的那样,dicts不会保留您写入的顺序。因此,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