2017-09-13 25 views
3

我的數據框有一個可包含長字符串的字符串列。我想獲取唯一字符串的列表,以及每個包含行索引的唯一字符串的列表。熊貓 - 從列中獲取唯一值以及它們出現的行索引列表

我可以想到兩種方法。

  1. 首先使用.unique()獲得獨特的列表,然後遍歷數據框建立索引列表,其中每個獨特的價值顯示出來
  2. 使用.groupBy()每組
  3. 在創建組,並得到行索引名單

但我不太確定哪一個更有效率(或者如果有其他方法可以更有效地做到這一點)。我在考慮效率的原因是,我想分離和分組的字段是一個字符串字段,可能有很長的字符串!

謝謝!

回答

3

演示:

In [16]: df 
Out[16]: 
    col 
0 aaaa 
1 bbbb 
2 aaaa 
3 aaaa 
4 bbbb 
5 cccc 

In [17]: df.groupby('col').groups 
Out[17]: 
{'aaaa': Int64Index([0, 2, 3], dtype='int64'), 
'bbbb': Int64Index([1, 4], dtype='int64'), 
'cccc': Int64Index([5], dtype='int64')} 

或作爲數據幀:

In [31]: pd.DataFrame([[k,v.values] 
         for k,v in df.groupby('col').groups.items()], 
         columns=['col','indices']) 
Out[31]: 
    col indices 
0 aaaa [0, 2, 3] 
1 bbbb  [1, 4] 
2 cccc  [5] 
+0

太棒了!所以按一個可以有長字符串值的列進行分組並不是一個壞主意,對吧? – shikhanshu

+0

@shikhanshu,是的,我相信這是正確的做法... – MaxU

2

假設你的數據幀是df和你的字符串列是string,你可以這樣做:

df.drop_duplicates('string')['string'].apply(\ 
lambda x: df[df['string'] == x].index.tolist()) 
+0

謝謝。這有效,但groupBy方法更清潔,除非這種方法更高效。評論? – shikhanshu

+0

我同意,我認爲'groupby()。groups'非常光滑:) – cmaher