2015-12-03 3 views
0

Я не уверен, что правильно использую термины, поскольку я совершенно новичок в pandas и python. Тем не менее, у меня есть два фрейма данных, которые я хотел бы присоединиться к одному. Их можно сопоставить с столбцом индекса и другим ключевым столбцом (образцом). «образец» варьируется от 001 до 100 и индекс от 1 до 729 для каждого образца.Конкатенация по индексу и ключу в pandas

df1

sample x1 x2 x3 x4 
id     
1 068 421.67 0.34 0.71 0.928 
2 068 28.77 0.07 0.81 0.952 
3 068 4.01 0.36 0.70 0.925 
4 068 41.07 0.32 0.70 0.924 

df2

q1 q2 q3 q4 q5 q6 sample 
id                     
1 a1 a2 r1 r2 c1 c2 068 
2 a1 a2 r1 r2 c1 c4 068 
3 a1 a2 r1 r2 c1 c5 068 
4 a1 a2 r1 r2 c3 c2 068 

Результат

sample x1  x2  x3  x4  q1 q2 q3 q4 q5 q6 
id     
1 068 41.967 0.34 0.71 0.928 a1 a2 r1 r2 c1 c2 
2 068 28.77  0.07 0.81 0.952 a1 a2 r1 r2 c1 c4 
3 068 4.01  0.36 0.70 0.925 a1 a2 r1 r2 c1 c5 
4 068 41.07  0.32 0.70 0.924 a1 a2 r1 r2 c3 c2 
+0

Что делать, если они имеют одинаковый индекс, но отличаются образец или другой индекс, но тот же образец? Как вы хотите это сделать? Кроме того, ваш пример завершится двумя столбцами с тем же именем. В этом случае значения одинаковы, но после присоединения вы можете получить разные значения, основываясь на том, как вы присоединитесь к ним. И это не то, что вам нужно :) – Tasos

+0

@Tasos Кажется, я присоединил два столбца и разные значения. конечно, я хочу, чтобы он был таким же. Для каждого образца имеется 729 строк, соответствующий этому индексу (id). – Wasser

ответ

0

Вы можете использовать merge для этого 2 dataframes на id и sample колонке. Затем переименовать столбцы, если вы хотите, чтобы они были q1, q2 ...:

In [33]: pd.merge(df1, df2, on=['id', 'sample']) 
Out[33]: 
    id sample  x1 x2 x3  x4 a1 a2 r1 r2 c1 c2 
0 1  68 421.67 0.34 0.71 0.928 a1 a2 r1 r2 c1 c2 
1 2  68 28.77 0.07 0.81 0.952 a1 a2 r1 r2 c1 c4 
2 3  68 4.01 0.36 0.70 0.925 a1 a2 r1 r2 c1 c5 
3 4  68 41.07 0.32 0.70 0.924 a1 a2 r1 r2 c3 c2 

Если вы хотите изменить имена столбцов:

df3 = pd.merge(df1, df2, on=['id', 'sample']) 
df3.columns = df3.columns[:-6].tolist() + ['q1', 'q2', 'q3', 'q4', 'q5', 'q6'] 

In [50]: df3 
Out[50]: 
    id sample  x1 x2 x3  x4 q1 q2 q3 q4 q5 q6 
0 1  68 421.67 0.34 0.71 0.928 a1 a2 r1 r2 c1 c2 
1 2  68 28.77 0.07 0.81 0.952 a1 a2 r1 r2 c1 c4 
2 3  68 4.01 0.36 0.70 0.925 a1 a2 r1 r2 c1 c5 
3 4  68 41.07 0.32 0.70 0.924 a1 a2 r1 r2 c3 c2 

EDIT

Вы можете создать последовательность для (если у вас их много):

In [87]: ['q' + str(num) for num in range(1,7)] 
Out[87]: ['q1', 'q2', 'q3', 'q4', 'q5', 'q6'] 
Смежные вопросы