<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Llegim els .csv reduïts de cada scraping. Es troben dins la següent estructura de directoris
Step1:  feim un DataFrame on cada columna conté els host_id de cada scrap i de nom li posam la data de l'scrap
Step2:  Feim un dataframe amb l'índex dels IDs únics de tots els dataframes i hi afegim els valors de les altres llistes a la posició corresponent, deixant espais buits on no s'ha trobat el host_id
Step3:  L'última entrada vàlida de cada fila ens dirà quin va ser el derrer cop que aquell host va ser vist en un scrap
<ASSISTANT_TASK:>
Python Code:
df1 = pd.read_csv('listings/30042015/30042015.csv', sep = ";")
df2 = pd.read_csv('listings/17072015/17072015.csv', sep = ";")
df3 = pd.read_csv('listings/02102015/02102015.csv', sep = ";")
df4 = pd.read_csv('listings/03012016/03012016.csv', sep = ";")
df5 = pd.read_csv('listings/08122016/08122016.csv', sep = ";")
df6 = pd.read_csv('listings/08042017/08042017.csv', sep = ";")
dfs_l = (df1, df2, df3, df4, df5, df6) 
#convertim a datime per cada df
for df in dfs_l:
    df.host_since = pd.to_datetime(df.host_since, format="%Y-%m-%d")
    df.last_scraped = pd.to_datetime(df.last_scraped, format="%Y-%m-%d")    
Explanation: Llegim els .csv reduïts de cada scraping. Es troben dins la següent estructura de directoris: 
bash
.
├── 02102015
│   ├── 02102015.csv
│   └── listings.csv
├── 03012016
│   ├── 03012016.csv
│   └── listings.csv
├── 08042017
│   ├── 08042017.csv
│   └── listings.csv
├── 08122016
│   ├── 08122016.csv
│   └── listings.csv
├── 17072015
│   ├── 17072015.csv
│   └── listings.csv
└── 30042015
    ├── 30042015.csv
    └── listings.csv
on "listing.csv" és l'arxiu original de descarregar d'inside airbnb i "[0-9].csv" és l'arxiu reduït amb una subselecció de columnes
End of explanation
l_hosts = [df['host_id'].values for df in dfs_l]  
df_hosts = pd.DataFrame(l_hosts)
df_hosts = df_hosts.T
df_hosts.columns = ['2015-04-30','2015-07-17','2015-10-02','2016-01-03','2016-12-08','2017-04-08']
df_hosts = df_hosts.apply(lambda x: x.sort_values().values)
print ([len(x) for x in l_hosts])
df_hosts.head()
Explanation: feim un DataFrame on cada columna conté els host_id de cada scrap i de nom li posam la data de l'scrap
End of explanation
uniq_id=np.sort(np.unique(np.hstack(l_hosts)))
id_df = pd.DataFrame(uniq_id)
id_df.set_index(0, inplace=True)
#molt millorable
## Ignasi no miris :/
for date in tqdm_notebook(df_hosts.columns): 
    id_df[date]=''
    for i in tqdm_notebook(id_df.index):
        if  np.any(df_hosts[date].isin([i])):
            id_df[date].loc[i] = i
        else:
            id_df[date].loc[i] = np.nan
id_df.head()
Explanation: Feim un dataframe amb l'índex dels IDs únics de tots els dataframes i hi afegim els valors de les altres llistes a la posició corresponent, deixant espais buits on no s'ha trobat el host_id
End of explanation
last_seen = id_df.apply(lambda x: x.last_valid_index(), axis=1) #magic function last_valid_index!
last_seen = pd.DataFrame(last_seen, columns=['host_until'])
last_seen.host_until = pd.to_datetime(last_seen.host_until, format="%Y-%m-%d") 
last_seen_dict = pd.Series(last_seen, index = last_seen.index).to_dict()
#mapejam el valor de l'ultima entrada valida al host_id per obtenir "host_until"
listing_tot = pd.concat(dfs_l)
listing_tot['host_until'] = listing_tot.host_id.map(last_seen_dict)
listing_tot.head()
listing_tot.to_csv('listings_host_until.csv',sep=';', index=False)
Explanation: L'última entrada vàlida de cada fila ens dirà quin va ser el derrer cop que aquell host va ser vist en un scrap:
End of explanation
<END_TASK>