簡體   English   中英

熊貓數據框:groupby和具有兩個不同列的圖

[英]Pandas data frame: groupby and plot with two different columns

我是Python的超級初學者。 長話短說,我想用一個列分組,將一個函數應用於一個列,將另一個函數應用於另一列,然后繪制結果(第一列到x軸,第二列到y軸)。

我有一個包含許多列的pandas數據框df 其中兩列是tour_idtour_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組中的行數的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'

您的代碼中的問題是,一旦您對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'])

輸出:

在此處輸入圖片說明

可以更容易實現:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM