【问题标题】:Matrix of pairwise row operations on pandas.DataFramepandas.DataFrame 上的成对行操作矩阵
【发布时间】:2017-11-02 11:14:46
【问题描述】:

我想在 DataFrame 中的所有行对上创建一个运算结果矩阵。

这是我想要的一个例子:

df = pandas.DataFrame({'val':  [ 2,    3,    5,    7  ],
                       'foo':  ['f1', 'f2', 'f3', 'f4']},
                      index=   ['n1', 'n2', 'n3', 'n4'])

def op1(row1, row2):
    return row1['val']*row2['val']

def op2(row1, row2):
    return f"{row1['foo']}{row2['foo']}"

def apply_op_to_all_row_pairs(df, op):
    # what goes in here?

apply_op_to_all_row_pairs(df, op1)
#     n1  n2  n3  n4
# n1   4   6  10  14
# n2   6   9  15  21
# n3  10  15  25  35
# n4  14  21  35  49

apply_op_to_all_row_pairs(df, op2)
#         n1      n2      n3      n4
# n1  'f1f1'  'f1f2'  'f1f3'  'f1f4'
# n2  'f2f1'  'f2f2'  'f2f3'  'f2f4'
# n3  'f3f1'  'f3f2'  'f3f3'  'f3f4'
# n4  'f4f1'  'f4f2'  'f4f3'  'f4f4'

我已经看到很多解决方案都依赖于计算距离矩阵的现有函数,但我想要更通用的东西。 例如,scipy.spatial.distance.pdist 执行我想要的格式,但只处理浮点数并且不允许您按名称选择列(或者至少我不知道如何)。

【问题讨论】:

    标签: python pandas numpy dataframe pairwise


    【解决方案1】:

    您可以只使用广播的 numpy 操作:

    v = df.val.values[:, None] * df.val.values
    v
    
    array([[ 4,  6, 10, 14],
           [ 6,  9, 15, 21],
           [10, 15, 25, 35],
           [14, 21, 35, 49]])
    
    x = df.foo.values[:, None] + df.foo.values
    x
    
    array([['f1f1', 'f1f2', 'f1f3', 'f1f4'],
           ['f2f1', 'f2f2', 'f2f3', 'f2f4'],
           ['f3f1', 'f3f2', 'f3f3', 'f3f4'],
           ['f4f1', 'f4f2', 'f4f3', 'f4f4']], dtype=object) 
    

    转成dataframe超级简单,调用构造函数即可:

    pd.DataFrame(x, df.index, df.index)
    
          n1    n2    n3    n4
    n1  f1f1  f1f2  f1f3  f1f4
    n2  f2f1  f2f2  f2f3  f2f4
    n3  f3f1  f3f2  f3f3  f3f4
    n4  f4f1  f4f2  f4f3  f4f4
    

    【讨论】:

    • 这并没有完成问题格式中的功能,但它完全符合我的要求。谢谢!
    • @Cai 很高兴听到这个消息!谢谢你告诉我。
    • 澄清我最初的要求:一种单独定义行对操作的方法,每个操作都可以应用于数据帧。这与您给出的区别在于函数定义(foo + foo)与广播混合在一起。拥有一个完全独立的会很好,但对于我现在需要的来说,这已经足够了。
    • @Cai 我明白你现在问什么了。不幸的是,去耦代价高昂,并且会导致性能大大降低。仅供参考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2015-06-17
    • 2016-07-06
    相关资源
    最近更新 更多