2017-07-19 28 views
7

Tôi có df dataframe sau:cột Python Pandas trận đấu VLOOKUP dựa trên tiêu đề giá trị

Customer_ID | 2015 | 2016 |2017 | Year_joined_mailing 
ABC   5  6  10  2015 
BCD   6  7  3  2016   
DEF   10  4  5  2017 
GHI   8  7  10  2016 

Tôi muốn tìm kiếm các giá trị của khách hàng trong năm họ tham gia vào danh sách gửi thư và lưu nó trong một cột mới.

Output sẽ là:

Customer_ID | 2015 | 2016 |2017 | Year_joined_mailing | Purchases_1st_year 
ABC   5  6  10  2015      5 
BCD   6  7  3  2016      7  
DEF   10  4  5  2017      5 
GHI   8  9  10  2016      9 

Tôi đã tìm thấy một số giải pháp cho VLOOKUP trận đấu trong python, nhưng không ai đó sẽ sử dụng các tiêu đề của các cột khác.

+1

tra cứu là các cột 2015, 2016 và 2017 – jeangelj

Trả lời

12

Sử dụng pd.DataFrame.lookup
Hãy nhớ rằng tôi giả định Customer_ID là chỉ mục.

df.lookup(df.index, df.Year_joined_mailing) 

array([5, 7, 5, 7]) 

df.assign(
    Purchases_1st_year=df.lookup(df.index, df.Year_joined_mailing) 
) 

      2015 2016 2017 Year_joined_mailing Purchases_1st_year 
Customer_ID               
ABC    5  6 10     2015     5 
BCD    6  7  3     2016     7 
DEF   10  4  5     2017     5 
GHI    8  7 10     2016     7 

Tuy nhiên, bạn phải cẩn thận với việc so sánh chuỗi có thể có trong tên cột và số nguyên trong cột năm đầu tiên ...

tùy chọn hạt nhân để đảm bảo loại so sánh được tôn trọng.

df.assign(
    Purchases_1st_year=df.rename(columns=str).lookup(
     df.index, df.Year_joined_mailing.astype(str) 
    ) 
) 

      2015 2016 2017 Year_joined_mailing Purchases_1st_year 
Customer_ID               
ABC    5  6 10     2015     5 
BCD    6  7  3     2016     7 
DEF   10  4  5     2017     5 
GHI    8  7 10     2016     7 
+0

wow !!! Tôi vẫn nghĩ về 'tan chảy', nhưng bạn hiểu rồi! +1 – Wen

+0

ma thuật ... đã không nghĩ rằng nó có thể trong một một lót - CẢM ƠN – jeangelj

+0

Bạn luôn được chào đón như mọi khi! – piRSquared

2

bạn có thể áp dụng "áp dụng" để mỗi hàng

df.apply(lambda x: x[x['Year_joined_mailing']],axis=1) 
+0

Cảm ơn bạn - điều này cũng hiệu quả! Tôi upvoted nó – jeangelj

1

tôi sẽ làm điều đó như thế này, giả định rằng các tiêu đề cột và Year_joined_mailing là những kiểu dữ liệu giống nhau và rằng tất cả Year_joined_mailing giá trị có giá trị cột. Nếu các kiểu dữ liệu không giống nhau, bạn có thể chuyển đổi nó bằng cách thêm str() hoặc int() nếu thích hợp.

df['Purchases_1st_year'] = [df[df['Year_joined_mailing'][i]][i] for i in df.index] 

Những gì chúng ta đang làm ở đây được lặp lại trên các chỉ số trong dataframe để có được những lĩnh vực 'Year_joined_mailing' cho chỉ số đó, sau đó sử dụng mà để có được những cột chúng ta muốn, và một lần nữa lựa chọn chỉ số từ cột, đẩy nó tất cả vào một danh sách và gán này để cột mới của chúng tôi 'Year_joined_mailing'

Nếu cột 'Year_joined_mailing' của bạn sẽ không luôn là một tên cột hợp lệ, sau đó thử:

from numpy import nan 
new_col = [] 
for i in df.index: 
    try: 
     new_col.append(df[df['Year_joined_mailing'][i]][i]) 
    except IndexError: 
     new_col.append(nan) #or whatever null value you want here) 
df['Purchases_1st_year'] = new_col 

mã dài hơn đoạn acco này mplishes cùng một điều, nhưng sẽ không phá vỡ nếu 'Year_joined_mailing' không phải là trong df.columns

+0

Cảm ơn bạn rất nhiều - điều này làm việc là tốt; vì vậy tôi đã bình chọn nó – jeangelj

Các vấn đề liên quan