如何在Pandas中找到两列的值之间的组合?

时间:2019-06-09 04:40:39

标签: python pandas combinations

我的数据框如下:

Source  Target  Value  Source location  Target location
a       b       10     [12.3,1.9]       [13.5,14.3]
c       v       10     [15.3,1.9]       [13.5,94.3]
c       d       18     [1.4,31.9]       [16.6,44.7]
p       q       10     [12.3,1.9]       [13.5,15.3]
x       z        8     [6.3,1.4]        [47.5,4.3]

我想找到SourceTarget之间的两个配对。我希望最终结果看起来像这样:

Source  Target  Value  Source location  Target location
a       b       10     [12.3,1.9]       [13.5,14.3]
b       a        9     [72.9,18.6]       [14.2,31.6]
c       e       18     [1.4,31.9]       [16.6,44.7]
e       c       14     [19.4,5.1]       [12.3,23.4]
z       x        6     [92.3,1.9]       [43.5,14.3]
x       z        8     [6.3,1.4]        [47.5,4.3]

如您所见,我想同时获得两对SourceTarget-即a-cc-a

我尝试研究Stackoverflow,但似乎这个问题之前从未得到解答。我查看了thisthis,但它们使用groupby来查找未重新排列现有数据帧的列数。 This是最接近我的,但是它返回的是行而不是列的唯一组合的数据帧。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

可能的解决方案之一是:

定义一个即将应用的功能:

def fn(row):
    r2 = row.copy()
    r2.Source, r2.Target = r2.Target, r2.Source
    r2['Source location'], r2['Target location'] =\
        r2['Target location'], r2['Source location']
    return r2

然后运行:

pd.concat([df, df.apply(fn, axis=1)]).sort_index()

此说明:

  • fn 函数应用于 df ,产生一个“阴影” DataFrame 与“成对反转”列
    • 目标
    • 源位置目标位置
  • 将它们串联起来。
  • 按索引排序。

如果您对索引值“加倍”不满意,请添加.reset_index(drop=True)