Словарь для представления ваших данных, это просто удобство загрузки образцов данных в dataframe.
d = {'Date1': {0: '01.01.2000', 1: '02.01.2000', 2: '03.01.2000'}, 'Date3': {0: '01.01.2000', 1: '02.01.2000', 2: '03.01.2000'}, 'Date2': {0: '02.01.2000', 1: '03.01.2000', 2: '04.01.2000'}, 'Log2': {0: 2000, 1: 1950, 2: 2000}, 'Log3': {0: 3000, 1: 3020, 2: 3000}, 'Log1': {0: 1000, 1: 1050, 2: 1100}}
df = pd.DataFrame(d)
df = df[['Date1','Log1','Date2','Log2','Date3','Log3']]
df.index.names = ['Index']
print df
Начиная Dataframe:
Date1 Log1 Date2 Log2 Date3 Log3
Index
0 01.01.2000 1000 02.01.2000 2000 01.01.2000 3000
1 02.01.2000 1050 03.01.2000 1950 02.01.2000 3020
2 03.01.2000 1100 04.01.2000 2000 03.01.2000 3000
Это грубо, но делает работу:
list_dfs = []
for i in range(1,4):
column_subset = [col for col in df.columns if str(i) in col]
df_subset_columns = df[column_subset]
df_subset_columns.columns = ['Date','Log']
df_subset_columns['id'] = i
list_dfs.append(df_subset_columns)
df = pd.concat(list_dfs,axis=0,ignore_index=True)
df = df.set_index(['Date','id'])
df = df.unstack('id')
df.columns = df.columns.droplevel(0)
На данный момент я думаю, что это то, что вы ищете логически:
id 1 2 3
Date
01.01.2000 1,000 nan 3,000
02.01.2000 1,050 2,000 3,020
03.01.2000 1,100 1,950 3,000
04.01.2000 nan 2,000 nan
Но вернуться к нужному выходу
list_dfs = []
for i in range(1,4):
df_s = df[i].to_frame()
df_s.columns = ['Log' + str(i)]
print df_s
list_dfs.append(df_s.reset_index())
print pd.concat(list_dfs,axis=1)
Есть намерение, что вы только сохранить значения из [Date2, log2] и [Date3, Log3], которые соответствуют датам в столбце Date1? Другими словами, следует ли полностью отказаться от даты 04.01.2000 с Date2? – andrew
@andrew, нет, дата 04.01.2000 не следует отбрасывать. Индекс длиннее представленных и окончательных дат совпадения всех журналов, но у них разные даты начала. –