Python Pandas:如何在數據框的列中分割已排序的字典


Answers

這應該工作:

In [1]: import pandas as pd  
In [2]: import operator
In [3]: df = pd.DataFrame({ 'id' : [0,1,2,3],
   ...:                      'asn' : [3320, 47886, 47601, 33438],
   ...:                      'orgs' : [{'Deutsche Telekom AG': 2288}, {'Joyent': 16, 'Equinix (Netherlands) B.V.': 7}, {'fusion services': 1024, 'GCE Global Maritime':16859}, {'Highwinds Network Group': 893}]
   ...:                    })

In [4]: df.orgs, df['value'] = zip(*df.orgs.apply(lambda x : sorted(x.items(),key=operator.itemgetter(1),reverse=True)[0]))

In [5]: df
Out[5]:
     asn  id                     orgs  value
0   3320   0      Deutsche Telekom AG   2288
1  47886   1                   Joyent     16
2  47601   2      GCE Global Maritime  16859
3  33438   3  Highwinds Network Group    893

我使用zip(* <first element of sorted dict items>) ,並將它們分配給df.orgsdf.value

對於空字典:

In [3]: df = pd.DataFrame({ 'id' : [0,1,2,3],
   ...:                      'asn' : [3320, 47886, 47601, 33438],
   ...:                      'orgs' : [{'Deutsche Telekom AG': 2288}, {'Joyent': 16, 'Equinix (Netherlands) B.V.': 7}, {'fusion services': 1024, 'GCE Global Maritime':16859}, {}]
   ...:                    })
In [4]: df.orgs.apply(lambda x : sorted(x.items(),key=operator.itemgetter(1),reverse=True)[0] if len(x) else ('',''))
Out[4]:
0     (Deutsche Telekom AG, 2288)
1                    (Joyent, 16)
2    (GCE Global Maritime, 16859)
3                            (, )
Name: orgs, dtype: object

In [5]: df.orgs, df['value'] = zip(*df.orgs.apply(lambda x : sorted(x.items(),key=operator.itemgetter(1),reverse=True)[0] if len(x) else ('','')))

In [6]: df
Out[6]:
     asn  id                 orgs  value
0   3320   0  Deutsche Telekom AG   2288
1  47886   1               Joyent     16
2  47601   2  GCE Global Maritime  16859
3  33438   3
Question

我有這樣的數據框:

id  asn      orgs
0   3320    {'Deutsche Telekom AG': 2288}
1   47886   {'Joyent': 16, 'Equinix (Netherlands) B.V.': 7}
2   47601   {'fusion services': 1024, 'GCE Global Maritime':16859}  
3   33438   {'Highwinds Network Group': 893}

我想排序實際上是字典的'orgs'列,然後在兩個不同的列中提取具有最高值的對(k,v)。 喜歡這個:

id  asn      org                      value
0   3320    'Deutsche Telekom AG'     2288
1   47886   'Joyent'                  16
2   47601   'GCE Global Maritime'     16859 
3   33438   'Highwinds Network Group' 893

目前我正在運行這個代碼,但它不正確的排序,然後我不知道如何提取最高價值的對。

df.orgs.apply(lambda x : sorted(x.items(),key=operator.itemgetter(1),reverse=True))

這給了我一個這樣的列表:

id  asn      orgs
0   3320    [('Deutsche Telekom AG', 2288)]
1   47886   [('Joyent', 16),( 'Equinix (Netherlands) B.V.', 7)]
2   47601   [('GCE Global Maritime',16859),('fusion services', 1024)]   
3   33438   [('Highwinds Network Group', 893)]

現在我怎樣才能把最高的價值和最高的價值放在兩個不同的專欄裡? 任何人都可以幫忙嗎?