熊猫系列元素的成对最小值

时间:2019-09-23 19:58:34

标签: pandas numpy

输入:

numbers = pandas.Series([3,5,8,1], index=["A","B","C","D"])

A   3
B   5
C   8
D   1

预期输出(pandas DataFrame):

    A   B   C   D
A   3   3   3   1
B   3   5   5   1
C   3   5   8   1
D   1   1   1   1

当前(有效)解决方案:

pairwise_mins = pandas.DataFrame(index=numbers.index)

def calculate_mins(series, index):
    to_return = numpy.minimum(series, series[index])
    return to_return

for col in numbers.index:
    pairwise_mins[col] = calculate_mins(numbers, col)

我怀疑必须有一个更好,更短的矢量化解决方案。谁可以帮我呢?

3 个答案:

答案 0 :(得分:2)

这可以通过broadcasting完成:

pd.DataFrame(np.where(numbers.values[:,None] < numbers.values, 
                      numbers[:,None], 
                      numbers),
             index=numbers.index,
             columns=numbers.index)

输出:

   A  B  C  D
A  3  3  3  1
B  3  5  5  1
C  3  5  8  1
D  1  1  1  1

答案 1 :(得分:2)

使用numpy提供的outer ufunc,并与numpy.minimum组合


n = numbers.to_numpy()

np.minimum.outer(n, n)

array([[3, 3, 3, 1],
       [3, 5, 5, 1],
       [3, 5, 8, 1],
       [1, 1, 1, 1]], dtype=int64)

答案 2 :(得分:0)

使用np.broadcast_tonp.clip

a = numbers.values
pd.DataFrame(np.broadcast_to(a, (a.size,a.size)).T.clip(max=a), 
                      columns=numbers.index, 
                      index=numbers.index)

Out[409]:
   A  B  C  D
A  3  3  3  1
B  3  5  5  1
C  3  5  8  1
D  1  1  1  1