2017-07-19 29 views
7

Aşağıdaki dataframe df vardır:Python Pandalar Maç Vlookup sütunları değerleri

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 

Onların posta listesine katıldı yılda müşterinin değerini bakmak ve bir kaydetmek istiyorum yeni sütun.

Çıktı olacaktır:

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 

Python maç VLOOKUP'a için bazı çözümler bulduk, ancak diğer sütunların başlıklarını kullanırsınız hiçbiri var.

+1

içinde değilse, aramaya 2015, 2016 ve 2017 sütunları – jeangelj

cevap

12

Kullan pd.DataFrame.lookup
Customer_ID dizininin geçerli olduğunu varsaydığımı unutmayın.

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 

Ancak ... İlk yıl sütununda sütun adları ve tamsayılar olası dizeleri karşılaştırarak ile dikkatli olmak zorunda tipini sağlamak için

Nükleer seçenek karşılaştırmalar dikkate alınır.

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 kesmek değil! Hala eriyik hakkında düşünüyorum, ama anladın! +1 – Wen

+0

magic ... bir tek liner mümkün olduğunu düşünmüyordu - TEŞEKKÜR EDERİM – jeangelj

+0

Her zamanki gibi hoş geldiniz! – piRSquared

2
her satıra "uygulamak" uygulayabilirsiniz

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

Teşekkür ederim - bu da işe yaradı! – jeangelj

1

ben sütun başlıkları ve Year_joined_mailing aynı veri türü olduğunu ve tüm Year_joined_mailing değerlerin geçerli olduğunu varsayarak, böyle yapacağını sütunlar. Veri türleri aynı değilse, uygun olduğunda str() veya int() ekleyerek dönüştürebilirsiniz.

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

Ya o dizin için 'Year_joined_mailing' alanını elde etmek dataframe içinde endeksler üzerinde yineleme olduğunu burada yapıyoruz, iterek, o zaman istediğiniz sütunu almak için kullanıyor ve tekrar sütundan o dizini seçerek senin 'Year_joined_mailing' sütunu her zaman geçerli bir sütun adını olmayacak olursa hepsi bir listeye ve yeni sütuna bu atama 'Year_joined_mailing'

sonra deneyin:

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 

Bu uzun kod parçacığı acco Aynı şey mplishes, ancakdf.columns

+0

'u destekledim Çok teşekkür ederim - bu da işe yaradı; bu yüzden onu destekledim – jeangelj