【问题标题】:Pandas Dataframe: Pairwise division of columns without replacement [duplicate]Pandas Dataframe:无需替换的列的成对划分[重复]
【发布时间】:2017-09-08 16:48:02
【问题描述】:

我试图将所有列除以每一列,但只划分一次(A/B 但不是 B/A)

来自Dividing each column by every other column and creating a new dataframe from the results

感谢@COLDSPEED,以下代码将所有列除以每一列(并添加相应的新列)。

我不知道如何避免配对重复。

import pandas as pd
import numpy as np
np.random.seed(42)


df = pd.DataFrame(np.random.randint(0,9,size=(5, 3)), columns=list('ABC'))

ratio_df = pd.concat([df[df.columns.difference([col])].div(df[col], axis=0) \
                   for col in df.columns], axis=1)

print ratio_df

哪些输出:

原始数据框

   A  B  C
0  6  3  7
1  4  6  2
2  6  7  4
3  3  7  7
4  2  5  4

结果数据框

          B         C         A         C         A         B
0  0.500000  1.166667  2.000000  2.333333  0.857143  0.428571
1  1.500000  0.500000  0.666667  0.333333  2.000000  3.000000
2  1.166667  0.666667  0.857143  0.571429  1.500000  1.750000
3  2.333333  2.333333  0.428571  1.000000  0.428571  1.000000
4  2.500000  2.000000  0.400000  0.800000  0.500000  1.250000

在第 0 行,第一列 B 的值为 B/A 或 3/6 = 0.5,第一列 A 为 A/B 或 6/3 = 2

我想为配对操作只保留一个结果(例如,只保留左列/右列)。

        A/B       A/C       B/C
0  2.000000  0.857143  0.428571
1  0.666667  2.000000  3.000000
2  0.857143  1.500000  1.750000
3  0.428571  0.428571  1.000000
4  0.400000  0.500000  1.250000

我没能找到这件事的线索。

我该如何解决?

谢谢!

【问题讨论】:

    标签: python-2.7 pandas


    【解决方案1】:

    这是一种方法 -

    idx0,idx1 = np.triu_indices(df.shape[1],1)
    df_out = pd.DataFrame(df.iloc[:,idx0].values/df.iloc[:,idx1])
    c = df.columns.values
    df_out.columns = c[idx0]+'/'+c[idx1]
    

    示例运行 -

    In [58]: df
    Out[58]: 
       A  B  C
    0  6  3  7
    1  4  6  2
    2  6  7  4
    3  3  7  7
    4  2  5  4
    
    In [59]: df_out
    Out[59]: 
            A/B       A/C       B/C
    0  2.000000  0.857143  0.428571
    1  0.666667  2.000000  3.000000
    2  0.857143  1.500000  1.750000
    3  0.428571  0.428571  1.000000
    4  0.400000  0.500000  1.250000
    

    获取idx0idx1 的另一种方法-

    from itertools import combinations
    
    idx0,idx1 = np.array(list(combinations(range(df.shape[1]),2))).T
    

    【讨论】:

    • 由于某种原因,我的结果与第 0 行 A/B = 2、A/C = 0 和 B/C = 0 不同。您认为这是类型问题(浮动)吗?谢谢
    • 这有效 df_out = pd.DataFrame(df.iloc[:,idx0].values/df.iloc[:,idx1].astype(float))
    • @Diego 这是因为输入都是整数。在脚本顶部使用:from __future__ import division,然后使用建议的解决方案。
    猜你喜欢
    • 2020-08-02
    • 2022-01-21
    • 2014-06-12
    • 2012-11-12
    • 2021-03-19
    • 2020-12-17
    • 2019-11-26
    • 1970-01-01
    相关资源
    最近更新 更多