使用索引或列标识符合并/连接Pandas DataFrame
我想用 'pandas.concat' 方法来合并两个数据框(DataFrame),但是我对 'pandas.concat' 的所有参数还不是很明白。我有两个数据框,它们的列中有相同的标识变量,但在某一列上有所不同。
import pandas as pd
dict_data = {'Treatment': ['C', 'C', 'C'], 'Biorep': ['A', 'A', 'A'], 'Techrep': [1, 1, 1], 'AAseq': ['ELVISLIVES', 'ELVISLIVES', 'ELVISLIVES'], 'mz':[500.0, 500.5, 501.0]}
df_a = pd.DataFrame(dict_data)
dict_data = {'Treatment': ['C', 'C', 'C'], 'Biorep': ['A', 'A', 'A'], 'Techrep': [1, 1, 1], 'AAseq': ['ELVISLIVES', 'ELVISLIVES', 'ELVISLIVES'], 'inte':[1100.0, 1050.0, 1010.0]}
df_b = pd.DataFrame(dict_data)
df_a
AAseq Biorep Techrep Treatment mz
0 ELVISLIVES A 1 C 500.0
1 ELVISLIVES A 1 C 500.5
2 ELVISLIVES A 1 C 501.0
df_b
AAseq Biorep Techrep Treatment int
0 ELVISLIVES A 1 C 1100
1 ELVISLIVES A 1 C 1050
2 ELVISLIVES A 1 C 1010
我可以用以下方式添加这一列:
df_m = df_a.copy()
df_m['inte'] = df_b['inte']
AAseq Biorep Techrep Treatment inte
0 ELVISLIVES A 1 C 1100
1 ELVISLIVES A 1 C 1050
2 ELVISLIVES A 1 C 1010
我的真实数据要复杂得多,我担心上面的方法可能会导致行中的值顺序错误(特别是因为我想在此之前使用 'pandas.melt')。
当我使用:
dfm = pd.concat([df_a, df_b])
AAseq Biorep Techrep Treatment inte mz
0 ELVISLIVES A 1 C NaN 500.0
1 ELVISLIVES A 1 C NaN 500.5
2 ELVISLIVES A 1 C NaN 501.0
0 ELVISLIVES A 1 C 1100 NaN
1 ELVISLIVES A 1 C 1050 NaN
2 ELVISLIVES A 1 C 1010 NaN
合并后的数据框按行扩展值,导致出现 NaN 值。
问题:我该如何使用 'concat' 来实现相同的结果(如上所示)?
谢谢你的支持!
1 个回答
1
使用
print pd.concat((df_a, df_b['inte']), axis=1)
你可以得到
AAseq Biorep Techrep Treatment mz inte
0 ELVISLIVES A 1 C 500.0 1100
1 ELVISLIVES A 1 C 500.5 1050
2 ELVISLIVES A 1 C 501.0 1010
这是不是你所期待的结果?
或者你可能有更复杂的数据,比如这个 - 看看Treatment
列中的不同值
AAseq Biorep Techrep Treatment mz
0 ELVISLIVES A 1 A 500.0
1 ELVISLIVES A 1 B 500.5
2 ELVISLIVES A 1 C 501.0
AAseq Biorep Techrep Treatment inte
0 ELVISLIVES A 1 C 1100
1 ELVISLIVES A 1 B 1050
2 ELVISLIVES A 1 A 1010
你需要根据AAseq Biorep Techrep Treatment
这几列的值来保持顺序,然后使用merge
import pandas as pd
dict_data = {
'AAseq': ['ELVISLIVES', 'ELVISLIVES', 'ELVISLIVES'],
'Biorep': ['A', 'A', 'A'],
'Techrep': [1, 1, 1],
'Treatment': ['A', 'B', 'C'],
'mz':[500.0, 500.5, 501.0]
}
df_a = pd.DataFrame(dict_data)
dict_data = {
'AAseq': ['ELVISLIVES', 'ELVISLIVES', 'ELVISLIVES'],
'Biorep': ['A', 'A', 'A'],
'Techrep': [1, 1, 1],
'Treatment': ['C', 'B', 'A'],
'inte':[1100.0, 1050.0, 1010.0]
}
df_b = pd.DataFrame(dict_data)
print pd.merge(left=df_a, right=df_b, on=['AAseq', 'Biorep', 'Techrep', 'Treatment'])
结果:
AAseq Biorep Techrep Treatment mz inte
0 ELVISLIVES A 1 A 500.0 1010
1 ELVISLIVES A 1 B 500.5 1050
2 ELVISLIVES A 1 C 501.0 1100