我是Python的超级新手。长话短说,我想用一个列分组,将一个函数应用于一个列,将另一个函数应用于另一列,然后绘制结果(第一列到x轴,第二列到y轴)。
我有一个熊猫数据框df
,其中包含许多列。其中两列为tour_id
和tour_distance
。
tour_id tour_distance
A 10
A 10
A 10
A 10
B 20
B 20
C 40
C 40
C 40
C 40
C 40
: :
: :
由于我假设tour_distance越长,每个tour_id所具有的行就越多,因此我想绘制tour_distance
的直方图与tour_id
每组中的行数。
问题1:这个groupby和plot问题最简单的解决方案是什么?
问题2:如何改善失败的尝试?
我的尝试:我认为制作这样的新数据框会更容易。
tour_id tour_distance row_counts
A 10 3
B 20 2
C 40 5
: : :
这样,我可以使用matplotlib
并这样做,
import matplotlib.pyplot as plt
x = df.tour_distance
y = df.row_counts
plt.bar(x,y)
但是,我无法创建此数据框。
df_tour_distance = df.groupby('tour_id').tour_distance.head(1)
df_tour_distance = pd.DataFrame(df_tour_distance)
df_size = df.groupby('tour_id').tour_distance.size()
df_size = pd.DataFrame(df_size)
df = pd.merge(df_size, df_tour_distance, on='tour_id')
>>> KeyError: 'tour_id'
这也失败了:
g = df.groupby('tour_id')
result = g.agg({'Count':lambda x:x.size(),
'tour_distance_grouped':lambda x:x.head(1)})
result
>>> KeyError: 'Count'
答案 0 :(得分:2)
代码中的问题是,一旦对tour_id
进行分组,它就成为索引。您必须指定as_index=False
或使用reset_index()
才能使用它。另外,您无需查找序列,然后将其合并回去。
您需要:
g = df.groupby(['tour_id', 'tour_distance']).size().reset_index(name='count')
plt.bar(g['tour_id'],g['count'])
输出:
答案 1 :(得分:0)
可以更容易实现:
import pandas as pd
tour_id = ['A']*4+['B']*2+['C']*5
tour_distance = [10]*4+[20]*2+[40]*5
df = pd.DataFrame({'tour_id': tour_id, 'tour_distance': tour_distance})
df = df.set_index('tour_id')
df2 = pd.DataFrame()
df2['tour_distance'] = df.groupby('tour_id')['tour_distance'].head(1)
df2['row_counts'] = df.groupby('tour_id').count()
print(df2)
结果:
tour_distance row_counts
tour_id
A 10 4
B 20 2
C 40 5