2016-11-12 76 views
2

我有這樣一個數據幀:熊貓:由值分組時的列是一個列表

df = pd.DataFrame({'type':[[1,3],[1,2,3],[2,3]], 'value':[4,5,6]}) 

type | value 
------------- 
1,3 | 4 
1,2,3| 5 
2,3 | 6 

我想由不同的值組中的「類型」列,以便例如總和值將是:

type | sum 
------------ 
1 | 9 
2 | 11 
3 | 15 

感謝您的幫助!

回答

2

您需要首先通過DataFrame構造,stackreset_index重塑Dataframe通過type列。然後抹上列typeint和最後groupby與聚集sum

df1 = pd.DataFrame(df['type'].values.tolist(), index = df['value']) \ 
     .stack() \ 
     .reset_index(name='type') 
df1.type = df1.type.astype(int) 
print (df1) 
    value level_1 type 
0  4  0  1 
1  4  1  3 
2  5  0  1 
3  5  1  2 
4  5  2  3 
5  6  0  2 
6  6  1  3 


print (df1.groupby('type', as_index=False)['value'].sum()) 
    type value 
0  1  9 
1  2  11 
2  3  15 

join另一種解決方案:

df1 = pd.DataFrame(df['type'].values.tolist()) \ 
     .stack() \ 
     .reset_index(level=1, drop=True) \ 
     .rename('type') \ 
     .astype(int) 
print (df1) 
0 1 
0 3 
1 1 
1 2 
1 3 
2 2 
2 3 
Name: type, dtype: int32 

df2 = df[['value']].join(df1) 
print (df2) 
    value type 
0  4  1 
0  4  3 
1  5  1 
1  5  2 
1  5  3 
2  6  2 
2  6  3 

print (df2.groupby('type', as_index=False)['value'].sum()) 
    type value 
0  1  9 
1  2  11 
2  3  15 

版本與Seriesget_level_values指數的選擇一級,通過to_series轉換爲Series和合計sum。最後reset_index和重命名列indextype

df1 = pd.DataFrame(df['type'].values.tolist(), index = df['value']).stack().astype(int) 
print (df1) 
value 
4  0 1 
     1 3 
5  0 1 
     1 2 
     2 3 
6  0 2 
     1 3 
dtype: int32 

print (df1.index.get_level_values(0) 
      .to_series() 
      .groupby(df1.values) 
      .sum() 
      .reset_index() 
      .rename(columns={'index':'type'})) 
    type value 
0  1  9 
1  2  11 
2  3  15 

編輯的評論 - 這是一個有點修改後的第二溶液DataFrame.pop

df = pd.DataFrame({'type':[[1,3],[1,2,3],[2,3]], 
        'value1':[4,5,6], 
        'value2':[1,2,3], 
        'value3':[4,6,1]}) 
print (df) 
     type value1 value2 value3 
0  [1, 3]  4  1  4 
1 [1, 2, 3]  5  2  6 
2  [2, 3]  6  3  1 

df1 = pd.DataFrame(df.pop('type').values.tolist()) \ 
     .stack() \ 
     .reset_index(level=1, drop=True) \ 
     .rename('type') \ 
     .astype(int) 
print (df1) 
0 1 
0 3 
1 1 
1 2 
1 3 
2 2 
2 3 
Name: type, dtype: int32 

print (df.join(df1).groupby('type', as_index=False).sum()) 
    type value1 value2 value3 
0  1  9  3  10 
1  2  11  5  7 
2  3  15  6  11 
+0

非常感謝你。如果我想要按類型(value1,value2,value3等)進行聚合,那麼會出現多個值類似的值。看來我需要爲每個想要聚合的列創建一個df,但必須有一個優雅的解決方案。 – user3635284

+0

請參閱更新。 – jezrael

+0

再次感謝你,也許對於大型數據集,最好避免連接並將列逐個彙總,不確定... – user3635284