2015-09-04 69 views
1

我有一個數據框,我嘗試以某種方式進行排序。使用Python中的Pandas Dataframes對數據進行排序

輸入:

CompanyName count assignee_name CallType  recvd_dttm 
Company3  4   Jill   Machine1  8/28/2015 13:46 
Company3  4   Jill   Machine1  8/27/2015 13:26 
Company3  4   Jack   Machine2  8/27/2015 11:46 
Company3  4   Jill   Machine1  8/25/2015 9:56 
Company2  3   Brad   Machine1  8/29/2015 12:43 
Company2  3   Lee   Machine2  8/28/2015 13:44 
Company2  3   Lee   Machine1  8/22/2015 19:45 
Company1  2   Lee   Machine1  8/12/2015 14:47 
Company1  2   Lee   Machine2  8/11/2015 13:44 
Company0  1   Tracy   Machine2  8/31/2015 13:32 

我想要什麼:

Company3   Company2  Company1  Company0 
4    3    2    1 
Jill    Lee   Lee    Tracy 
Machine1   Machine1  Machine1  Machine2 
8/28/2015  8/29/2015  8/12/2015  8/31/2015 

它應該輸出的公司名稱中的順序誰在數據框中顯示了大部分。然後它應該顯示拿起MOST電話的人。那麼CallType和recvd_dttm的信息應該是最新的信息。

我用這個:

mode = (lambda ts: ts.value_counts(sort=True).index[0] 
        if len(ts.value_counts(sort=True)) else None) 
cols = df['CompanyName'].value_counts().index 

df = df.groupby('CompanyName')[['count','assignee_name', 'CallType', 'receiveddate']].agg(mode).T.reindex(columns=cols) 

它按公司名稱正確輸出和計數,但選擇一個隨機呼籲其他信息,而不是最近的電話。

我也在考慮使用類似df.groupby(['CompanyName','count']).agg(lambda x:x.value_counts().index[0])

但我得到UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 21285: ordinal not in range(128)錯誤。

回答

1
# convert datetime string to pd.timestamp 
df['recvd_dttm'] = pd.to_datetime(df['recvd_dttm'], format='%m/%d/%Y %H:%M') 

def func(g): 
    temp = g[g['recvd_dttm'] == g['recvd_dttm'].max()].iloc[0] 
    temp['assignee_name'] = g['assignee_name'].value_counts().index[0] 
    return temp.drop('CompanyName') 

df.groupby('CompanyName').apply(func).sort(['count'], ascending=False).T 

CompanyName    Company3    Company2    Company1    Company0 
count       4     3     2     1 
assignee_name     Jill     Lee     Lee    Tracy 
CallType     Machine1    Machine1    Machine1    Machine2 
recvd_dttm  2015-08-28 13:46:00 2015-08-29 12:43:00 2015-08-12 14:47:00 2015-08-31 13:32:00 
+0

是的!這讓我更靠近一步。接下來的事情是讓assignee_name成爲該公司名稱顯示最多的名稱。你會知道如何得到它嗎? – jenryb

+0

就像在這種情況下一樣,對於公司2而言,李會出現,而不是布拉德,因爲他出現在公司2的電話中更多。 – jenryb

+0

@jenryb我已編輯帖子以解決該問題。 :-) –

1

如何:

In [121]: most = df.groupby('CompanyName')['assignee_name'].transform(lambda x: x.value_counts().idxmax())) 

In [122]: df = df[df['assignee_name'] == most] 

In [123]: df = df.sort(['CompanyName', 'recvd_dttm']) 

In [124]: df = df.groupby('CompanyName').last() 

In [125]: df 
Out[125]: 
      count assignee_name CallType   recvd_dttm 
CompanyName             
Company0   1   Tracy Machine2 2015-08-31 13:32:00 
Company1   2   Lee Machine1 2015-08-12 14:47:00 
Company2   3   Lee Machine2 2015-08-28 13:44:00 
Company3   4   Jill Machine1 2015-08-28 13:46:00 
+0

這是偉大的,但不是我想要的格式,這對於代碼的其餘部分非常重要。我會考慮格式化它一樣。 – jenryb

相關問題