Pandas:合并同一数据框架内的行对,同时保留这两行



我有一个已执行交易的表,其中每个操作记录两次,从每一方报告,因此每个操作由两行表示。对于某些交易,行与行之间存在差异,因此支付和收到的金额并不总是匹配。例如,可能一方报告他们支付了100,收到了60,而对方报告他们收到了55,支付了90。所以我需要把它们结合起来,找出报告数字之间的差异(哪里有差异)。

交易商(按字母顺序排列)tbody> <<tr>菲利普艾萨克
交易对手A 交易对手B 已支付金额 收到金额
约翰标记10060约翰,马克
标记约翰6590约翰,马克
艾萨克11020艾萨克,菲利普
菲利普20100艾萨克,菲利普

用您想要的条件定义两个新列。看起来你想要这样的东西

df['Counterparty A_y'] = df['Counterparty B']
df['Counterparty B_y'] = df['Counterparty A']
df['Amount payed_y'] = df['Amount received']
df['Amount recieved_y'] = df['Amount payed']

这将保留旧列并添加新列。然后你可以用df。重命名:重命名您的原始列,使它们有x,就像您想要的结果一样。

每笔交易必须有对行。这些很可能是相邻的行;如果没有,那么必须有一些具有tradeID的列,该列可用于将行排序为相邻的对。然后,解决方案就是简单地生成一个新的数据帧,其中每个行对进行交换,并将它们组合成一个并排的DateFrame。下面的代码显示了原理—您可以修改、重新排列和重新命名列,以产生所需的输出。我不认为有一种矢量化的方法可以做到这一点,所以循环是唯一的方法,尽管它会花费一些时间来处理大数据。

df= pd.DataFrame({'a':[1, 3, 5, 7, 9, 11], 'b': [2, 4, 6, 8, 10, 12]})
num = len(df)-1
df_flip=df.copy()
df_flip.columns = ['c', 'd']
for idx in range(0, num, 2):
df_flip.iloc[idx,:],df_flip.iloc[idx+1,:]=df.iloc[idx+1,:],df.iloc[idx,:]
combi = pd.concat([df, df_flip], axis = 1)

生成下面的a, b列成对交换到c, d:

a   b   c   d
0   1   2   3   4
1   3   4   1   2
2   5   6   7   8
3   7   8   5   6
4   9  10  11  12
5  11  12   9  10

这里我假设每个交易的两行是连续的,也不排序整个df:

cols = ['A_x', 'B_x', 'payed_x', 'received_x', 'A_y', 'B_y', 'payed_y', 'received_y']
def concat_rows(d: pd.DataFrame):
d = d.loc[:, d.columns != 'Traders']
v1 = list(d.values[0, :])
v2 = list(d.values[1, :])
return pd.DataFrame([v1+v2, v2+v1], columns=cols)
df2 = df.groupby('Traders').apply(concat_rows)

这里的列名定义是手动的,但是你可以修改它,只要它匹配df2

的预期列数。

最新更新