Python 用相同的列名但不同的后缀连接数据帧
我使用pandas merge根据一组条件将两个数据帧(每个24列)组合在一起,以生成一个包含具有相同值的行的数据帧;当然,每个数据帧中还有许多其他列具有不同的值。用于执行此操作的代码是:Python 用相同的列名但不同的后缀连接数据帧,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我使用pandas merge根据一组条件将两个数据帧(每个24列)组合在一起,以生成一个包含具有相同值的行的数据帧;当然,每个数据帧中还有许多其他列具有不同的值。用于执行此操作的代码是: Merged=pd.merge(Buy_MD,Sell_MD, on= ['ID','LocName','Sub-Group','Month'], how = 'inner' ) 结果是一个数据帧,它有48列,我现在想把它们放在一起(可能使用melt)。因此,要形象化这一点: D
Merged=pd.merge(Buy_MD,Sell_MD, on= ['ID','LocName','Sub-Group','Month'], how = 'inner' )
结果是一个数据帧,它有48列,我现在想把它们放在一起(可能使用melt)。因此,要形象化这一点:
Deal_x ID_x Location_x \... 21 other columns with _x postfix
0 130 5845 A
1 155 5845 B
2 138 6245 C
3 152 7345 A
Deal_y ID_y Location_y \ ... 21 other columns with _y postfix
0 155 9545 B
1 155 0345 C
2 155 0445 D
我希望这成为:
Deal ID Location \
0 130 5845 A
1 155 5845 B
2 138 6245 C
3 152 7345 A
0 155 9545 B
1 155 0345 C
2 155 0445 D
请问我该怎么做 首先,使用
df.columns.str.split
去掉后缀,并从结果中的每个子列表中获取第一个拆分值
df_list = [df1, df2, ...] # a generic solution for 2 or more frames
for i, df in enumerate(df_list):
df_list[i].columns = df.columns.str.split('_').str[0]
现在,连接结果-
df = pd.concat(df_list, ignore_index=True)
df
Deal ID Location
0 130 5845 A
1 155 5845 B
2 138 6245 C
3 152 7345 A
4 155 9545 B
5 155 345 C
6 155 445 D
此外,如果您感兴趣,请使用ID
上的str.zfill
获得您的预期输出-
v = df.ID.astype(str)
v.str.zfill(v.str.len().max())
0 5845
1 5845
2 6245
3 7345
4 9545
5 0345
6 0445
Name: ID, dtype: object
返回结果。您可以使用
后缀执行操作,将列拆分为多索引,然后取消堆栈
Merged=pd.merge(Buy_MD,Sell_MD, on= ['ID','LocName','Sub-Group','Month'], how = 'inner', suffixes=('_buy', '_sell')
Merged.columns = pd.MultiIndex.from_tuples(Merged.columns.str.rsplit('_').map(tuple), names=('key', 'transaction'))
如果要摆脱多索引
,可以执行以下操作:
Merged.index = Merged.index.droplevel('transaction')
@尼莫先生如果有帮助,别忘了投票,接受答案。谢谢。这当然是我想要的答案,但我得到了一个奇怪的错误。:ValueError:平面形状没有对齐。。。。有什么想法吗?@nemo奇怪,concat
非常适合那些不对齐的形状。请重新启动您的内核。这里似乎出现了错误:对于i,枚举中的df(df_列表):df_列表[i]。columns=df.columns.str.split(“”“).str[0]@MrNemo您能为我提供一个复制这个的文件吗?
transaction Deal ID Location
0 buy 130 5845 A
0 sell 155 9545 B
1 buy 155 5845 B
1 sell 155 345 C
2 buy 138 6245 C
2 sell 155 445 D
Merged.index = Merged.index.droplevel('transaction')