Pandas Dataframe:无需替换的列的成对划分

时间:2017-09-08 16:48:03

标签: python-2.7 pandas

我试图按列分隔所有列但只有一次(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

我无法找到关于此事的线索。

我该如何解决?

谢谢!

1 个答案:

答案 0 :(得分:3)

这是一种方法 -

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