2017-04-05 34 views
5

tôi có một danh sách như
Làm một nhóm trong dataframe trong gấu trúc

groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']] 

và dataframe như

A 100 
B 200 
C 300 
D 400 

Tôi muốn làm cho một số tiền nhóm từ danh sách ở trên để trở thành:

Group 1 300 
Group 2 700 

Tôi có thể làm điều này bằng cách sử dụng con trăn python như thế nào? Không cần phải nói tôi là một newbie trong gấu trúc. Cảm ơn.

Trả lời

1

Một tùy chọn khác ... nhưng có vẻ như cách @ jezrael tốt hơn!

import pandas as pd 

groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']] 

df0 = pd.melt(pd.DataFrame(groups).set_index(0).T) 
df1 = pd.read_clipboard(header=None) # Your example data 

df = df1.merge(df0, left_on=0, right_on='value')[['0_y', 1]] 
df.columns = ['Group', 'Value'] 

print df.groupby('Group').sum() 


     Value 
Group   
Group1 300 
Group2 700 
4

Bạn cần tạo dict bởi lists và sau đó groupby và tổng hợp sum:

df = pd.DataFrame({'a': ['A', 'B', 'C', 'D'], 'b': [100, 200, 300, 400]}) 
print (df) 
    a b 
0 A 100 
1 B 200 
2 C 300 
3 D 400 

groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']] 

#http://stackoverflow.com/q/43227103/2901002 
d = {k:row[0] for row in groups for k in row[1:]} 
print (d) 
{'B': 'Group1', 'C': 'Group2', 'D': 'Group2', 'A': 'Group1'} 

print (df.set_index('a').groupby(d).sum()) 
      b 
Group1 300 
Group2 700 

phải là có thể một chút thay đổi giải pháp - nếu mà chỉ có cột b là tập hợp bởi sum. Cuối cùng reset_index để chuyển chỉ mục thành cột.

df1 = df.set_index('a').groupby(pd.Series(d, name='a'))['b'].sum().reset_index() 
print (df1) 
     a b 
0 Group1 300 
1 Group2 700 

df2 = df.groupby(df['a'].map(d))['b'].sum().reset_index() 
print (df2) 
     a b 
0 Group1 300 
1 Group2 700 
1

Sử dụng python 3 giải nén và hiểu để tạo từ điển. Sử dụng từ điển đó trong bản đồ ở cột đầu tiên. Sử dụng ánh xạ đó để nhóm theo.

Xem xét danh sách liệt kê groups và dataframe df

groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']] 
df = pd.DataFrame(dict(a=list('ABCD'), b=range(100, 401, 100))) 

Sau đó:

df.groupby(df.a.map({k: g for g, *c in groups for k in c})).sum() 

      b 
a   
Group1 300 
Group2 700 
Các vấn đề liên quan