计算两列的比率

时间:2019-09-13 08:56:21

标签: python pandas dataframe

具有四列的数据框:

x1  x2  x3  x4  

所需的输出:

x1/x2  x1/x2  x1/x3  x2/x3  x2/x4  x3/x4

我想创建新列,它们是原始列的比率。

我唯一想到的方法是手动进行:

df['x1/x2'] = df['x1']/df['x2']

但是,我将在原始数据框中包含20多个列。有什么办法可以自动化这个过程?我正在考虑循环,但我不知道从哪里开始。

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

创建列名称的所有对组合,循环并划分为新列:

from  itertools import combinations

for a, b in combinations(df.columns, 2):
    df[f'{a}/{b}'] = df[a].div(df[b])

或者使用列表推导,通过concat联接在一起,并通过join添加原始列:

df = df.join(pd.concat([df[a].div(df[b]).rename(f'{a}/{b}') 
                         for a, b in combinations(df.columns, 2)], 1))

print (df)
   x1  x2  x3  x4     x1/x2     x1/x3     x1/x4     x2/x3     x2/x4     x3/x4
0   4   7   1   5  0.571429  4.000000  0.800000  7.000000  1.400000  0.200000
1   5   8   3   3  0.625000  1.666667  1.666667  2.666667  2.666667  1.000000
2   4   9   5   6  0.444444  0.800000  0.666667  1.800000  1.500000  0.833333
3   5   4   7   9  1.250000  0.714286  0.555556  0.571429  0.444444  0.777778
4   5   2   1   2  2.500000  5.000000  2.500000  2.000000  1.000000  0.500000
5   4   3   0   4  1.333333       inf  1.000000       inf  0.750000  0.000000

答案 1 :(得分:0)

您可以尝试:

df = pd.DataFrame({'x1':[1,2,3,4,5], 'x2': [10, 10, 10, 10, 10], 'x3' : [100, 100, 100 ,100, 100], 'x4': [10, 10, 10, 10, 10]})

columns = df.columns

def pattern(c = columns):
    yield from ((v1, v2) for i, v1 in enumerate(c) for v2 in c[i + 1:])

for name1, name2 in pattern():
    df[f'{name1}/{name2}'] = df[name1].div(df[name2])

输出:

enter image description here

此外,您可以连接所有所需的列:

pd.concat([df[n1].div(df[n2]).rename(f'{n1}/{n2}') for n1, n2 in pattern()], 1)

输出:

enter image description here

答案 2 :(得分:0)

您可以使用Assign做一个单线纸:

import pandas as pd
from itertools import combinations

df = df.assign(**{f'{a}/{b}': df[a]/df[b] for a,b in combinations(df,2)})