我正在尝试绘制一个大型数据集的折线图,我想将y设置为“ count”值。
这是一个模拟df:
my = pd.DataFrame(np.array(
[['Apple', 1],
['Kiwi', 2],
['Clementine', 3],
['Kiwi', 1],
['Banana', 2],
['Clementine', 3],
['Apple', 1],
['Kiwi', 2]]),
columns=['fruit', 'cheers'])
我希望情节使用“欢呼声”作为x,然后为每个“水果”和“欢呼声”的次数写一行
编辑:折线图可能不是最好的选择,然后请告诉我。我想要这样的东西:
在大数据集中可能只有一个,但没有几个“零”,也许我应该做一个更大的模拟df。
答案 0 :(得分:2)
我看到您已经接受了答案,但是另一种替代方法是
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
my = pd.DataFrame(np.array([['Apple', 1],
['Kiwi', 2],
['Clementine', 3],
['Kiwi', 1],
['Banana', 2],
['Clementine', 3],
['Apple', 1],
['Kiwi', 2]]),
columns=['fruit', 'cheers'])
my_pivot = my.pivot_table(index = 'cheers',
columns = 'fruit',
fill_value = 0,
aggfunc={'fruit':len})['fruit']
my_pivot.plot.line()
plt.tight_layout()
plt.show()
输出:
答案 1 :(得分:1)
my.groupby('fruit').sum().plot.barh()
请注意,您的示例数据框似乎具有表示为string
类型的数字,因此您可以在使用之前将其更改为int
my.cheers = my.cheers.astype(int)
之所以如此,是因为您通过2D数组初始化了数据框。
您可以通过使用字典方法来创建数据框来避免这种情况:
my = pd.DataFrame(
{'fruit': ['Apple', 'Kiwi', 'Clementine', 'Kiwi', 'Banana', 'Clementine', 'Apple', 'Kiwi'],
'cheers': [1, 2, 3, 1, 2, 3, 1, 2]})
答案 2 :(得分:1)
下面的代码将为每个“水果”绘制一条线,其中x
坐标是“欢呼声”的数量,y
坐标是每个水果的欢呼声计数。
首先,将数据帧按水果分组以获取每个水果的欢呼声列表。接下来,为每个欢呼声列表计算并绘制直方图。使用max_cheers_count是为了确保所有绘制线的x坐标相同。
注意:请参阅下面的@Heike答案,以获得更多的pythonic解决方案。
import matplotlib.pyplot as plt
import numpy as np
# convert 'cheers' column to int
my.cheers = my['cheers'].astype(int)
# computes maximal cheers value, to use later for the histogram
max_cheers_count = my['cheers'].max()
# get cheer counts per fruit
cheer_counts = my.groupby('fruit').apply(lambda x: x['cheers'].values)
# for each fruit compute histogram of cheer counts and plot it
plt.figure()
for row in cheer_counts.iteritems():
histogram = np.histogram(a=row[1], bins=range(1,max_cheers_count+2))
plt.plot(histogram[1][:-1], histogram[0], marker='o', label=row[0])
plt.xlabel('cheers')
plt.ylabel('counts')
plt.legend()
答案 3 :(得分:1)
以下是获取精确您发布的图形(从0开始的曲线)的另一种方法。这个想法是要计算每种水果在不同欢呼声中出现的频率,然后利用字典。
from collections import Counter
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# Define the dataframe here
# my = pd.DataFrame(...)
cheers = np.array(my['cheers'])
for fr in np.unique(my['fruit']):
freqs = Counter(cheers[np.argwhere(my['fruit']==fr)].flatten()) # Count the frequency
init_dict = {'0': 0}
init_dict.update({i: 0 for i in np.unique(cheers)}) # Initialize the dictionary with 0 values
for k, v in freqs.items():
init_dict[k] = v # Update the values of cheers
plt.plot(init_dict.keys(), init_dict.values(), '-o', label=fr) # Plot each fruit line
plt.legend()
plt.yticks(range(4))
plt.show()