Присоединяйтесь к нескольким файлам CSV с помощью панд Python - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь создать CSV-файл из нескольких CSV-файлов, используя панд Python.

accreditation.csv: -

"pid","accreditation_body","score"
"25799","TAAC","4.5"
"25796","TAAC","5.6"
"25798","DAAC","5.7"

ref_university: -

"id","pid","survery_year","end_year"
"1","25799","2018","2018"
"2","25797","2016","2018"

Я хочу создать новую таблицу, прочитав инструкцию из table_structure.csv.Я хочу объединить две таблицы и переписать accreditation.csv.REFERENCES ref_university(id, survey_year) соединяется с ref_university.csv и вставляет значение столбцов id и survery_year путем сопоставления значения столбца pid.

table_structure.csv: -

table_name,attribute_name,attribute_type,Description
,,,
accreditation,accreditation_body,varchar,
,grading,varchar,
,pid,int4, "REFERENCES ref_university(id, survey_year)"
,score,float8,

ИзмененоCSV-файл должен выглядеть следующим образом:

Новый accreditation.csv: -

"accreditation_body","grading","pid","id","survery_year","score"
"TAAC","","25799","1","2018","2018","4.5"
"TAAC","","25797","2","2016","2018","5.6"
"DAAC","","25798","","","","5.7"

Я могу прочитать CSV в Panda

df = pd.read_csv("accreditation.csv")

Но, как это рекомендуетсяпрочитать инструкцию REFERENCES и выбрать значение столбцов.Если значения нет, столбец должен быть пустым.Мы не можем хардкор pid в функции панды.Мы должны прочитать table_structure.csv и сопоставить, если есть ссылка, затем вызвать упомянутые столбцы.Его не следует объединять, следует добавить только определенные столбцы.

1 Ответ

0 голосов
/ 05 июня 2018

Динамическое решение возможно, но не так просто:

df = pd.read_csv("table_structure.csv")

#remove only NaNs rows
df = df.dropna(how='all')
#repalce NaNs by forward filling
df['table_name'] = df['table_name'].ffill()

#create for each table_name one row
df = (df.dropna(subset=['Description'])
       .join(df.groupby('table_name')['attribute_name'].apply(list)
              .rename('cols'), 'table_name'))

#get name of DataFrame and new columns names
df['df1'] = df['Description'].str.extract('REFERENCES\s*(.*)\s*\(')
df['new_cols'] = df['Description'].str.extract('\(\s*(.*)\s*\)')
df['new_cols'] = df['new_cols'].str.split(', ')
#remove unnecessary columns
df = df.drop(['attribute_type','Description'], axis=1).set_index('table_name')
print (df)
table_name                                                                
accreditation            pid  [accreditation_body, grading, pid, score]   

                          df1           new_cols  
table_name                                        
accreditation  ref_university  [id, survey_year]  

#for select by named create dictioanry of DataFrames
data = {'accreditation' : pd.read_csv("accreditation.csv"), 
        'ref_university': pd.read_csv("ref_university.csv")}

#seelct by index
v = df.loc['accreditation']
print (v)
attribute_name                                          pid
cols              [accreditation_body, grading, pid, score]
df1                                          ref_university
new_cols                                  [id, survey_year]
Name: accreditation, dtype: object

Выбор по словарю и Series v

df = pd.merge(data[v.name], 
               data[v['df1']][v['new_cols'] + [v['attribute_name']]], 
               on=v['attribute_name'], 
               how='left')

преобразуется в:

df = pd.merge(data['accreditation'], 
               data['ref_university'][['id', 'survey_year'] + ['pid']], 
               on='pid', 
               how='left')

и возврат:

print (df)
     pid accreditation_body  score   id  survey_year
0  25799               TAAC    4.5  1.0       2018.0
1  25796               TAAC    5.6  NaN          NaN
2  25798               DAAC    5.7  NaN          NaN

Последнее добавление новых столбцов по union и reindex:

df = df.reindex(columns=df.columns.union(v['cols']))
print (df)
  accreditation_body  grading   id    pid  score  survey_year
0               TAAC      NaN  1.0  25799    4.5       2018.0
1               TAAC      NaN  NaN  25796    5.6          NaN
2               DAAC      NaN  NaN  25798    5.7          NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...