2016-11-12 78 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