Добро пожаловать на SO. Так что этот вопрос на самом деле немного сложнее, чем может показаться. Первое, что нужно понять, это то, что pandas лучше всего работает с «опрятными» данными (https://en.wikipedia.org/wiki/Tidy_data). Где Excel отлично подходит для ввода данных, он не оптимизирован для анализа (как вы выяснили). Вы узнаете больше о это потому, что вы больше разбираетесь в кодировании с фреймами данных, а пока просто понимаете, что для правильной работы все должно быть в разных форматах.
Итак, сначала вам нужно перевести ваш второй файл данных из широкого в длинный формат (вам нужно привести его в порядок):
df_1 = pd.DataFrame({'timestamp':[1, 1, 4, 5],
'machine_number':[123, 789, 789, 123],
'active_inactive':[1, 0, 1, 0]})
df_2 = pd.DataFrame({'timestamp':[1, 2, 3, 4, 5], # note that I changed this name to 'timestamp' so
# it's the same in both dataframe
'123':['', '', '', '', ''],
'789':['', '', '', '', '']})
(df_2_melted = pd.melt(df_2, id_vars=['timestamp'],
value_vars=['123', '789'],
var_name='machine_number')
.drop(columns='value'))
df_2_melted['machine_number'] = df_2_melted['machine_number'].astype('int64')
# I had to change this column to 'int64' because the next operation won't work unless the
# columns are the same type
Вот тебе вот что:
timestamp machine_number
0 1 123
1 2 123
2 3 123
3 4 123
4 5 123
5 1 789
6 2 789
7 3 789
8 4 789
9 5 789
Затем вы можете «объединить» столбцы вместе. Это похоже на операцию соединения из sql или и index_match
/ vlookup
в excel:
merged = pd.merge(df_2_melted, df_1, how='left', on=['timestamp', 'machine_number'])
merged
timestamp machine_number active_inactive
0 1 123 1.0
1 2 123 NaN
2 3 123 NaN
3 4 123 NaN
4 5 123 0.0
5 1 789 0.0
6 2 789 NaN
7 3 789 NaN
8 4 789 1.0
9 5 789 NaN
Затем, если вы хотите вернуть его в тот же формат, что и в исходном кадре данных, вам нужно pivot
вернуть его обратно (как следует из названия, это похоже на сводную таблицу из excel):
merged.pivot(index='timestamp', columns='machine_number', values='active_inactive').reset_index(drop=True)
machine_number 123 789
0 1.0 0.0
1 NaN NaN
2 NaN NaN
3 NaN 1.0
4 0.0 NaN
Тем не менее, вы захотите сохранить все в чистом формате для анализа, поэтому я бы предложил использовать сводку только в том случае, если вы захотите в конце концов выписать его в виде электронной таблицы, чтобы дать кому-то еще.