我已经使用pandas merge将两个数据帧(每个24列)组合在一起,基于一组条件,生成一个包含具有相同值的行的数据帧;当然,每个数据帧中还有许多其他列具有不同的值。用于执行此操作的代码是:
Merged=pd.merge(Buy_MD,Sell_MD, on= ['ID','LocName','Sub-Group','Month'], how = 'inner' )
结果是一个有48列的数据框,我现在想把它们汇总在一起(可能使用熔化)。所以想象一下:
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
请问我该怎么做?
答案 0 :(得分:2)
首先,使用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
此外,如果您有兴趣,请使用str.zfill
上的ID
来获得预期的输出 -
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
重新分配结果。
答案 1 :(得分:1)
您可以对suffixes
执行某些操作,将列拆分为MultiIndex
,然后取消堆叠
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 = Merged.stack(level='transaction')
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
如果你想摆脱MultiIndex
你可以做的事情:
Merged.index = Merged.index.droplevel('transaction')