在 pandas 中连接索引和键
Concatenating on index and key in pandas
我不确定我是否正确使用了这些术语,因为我对 pandas 和 python 还很陌生。但是,我想将两个数据框合二为一。它们可以在索引列和其他键列(示例)上匹配。 'sample' 范围从 001 到 100,每个样本的索引从 1 到 729。
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
您可以对 id
和 sample
列上的那 2 个数据帧使用 merge
。然后重命名列,如果你希望它们是 q1, q2 ...:[=17=]
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
编辑
您可以为列名创建序列(如果您有很多):
In [87]: ['q' + str(num) for num in range(1,7)]
Out[87]: ['q1', 'q2', 'q3', 'q4', 'q5', 'q6']
我不确定我是否正确使用了这些术语,因为我对 pandas 和 python 还很陌生。但是,我想将两个数据框合二为一。它们可以在索引列和其他键列(示例)上匹配。 'sample' 范围从 001 到 100,每个样本的索引从 1 到 729。
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
您可以对 id
和 sample
列上的那 2 个数据帧使用 merge
。然后重命名列,如果你希望它们是 q1, q2 ...:[=17=]
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
编辑
您可以为列名创建序列(如果您有很多):
In [87]: ['q' + str(num) for num in range(1,7)]
Out[87]: ['q1', 'q2', 'q3', 'q4', 'q5', 'q6']