具有四列的数据框:
x1 x2 x3 x4
所需的输出:
x1/x2 x1/x2 x1/x3 x2/x3 x2/x4 x3/x4
我想创建新列,它们是原始列的比率。
我唯一想到的方法是手动进行:
df['x1/x2'] = df['x1']/df['x2']
但是,我将在原始数据框中包含20多个列。有什么办法可以自动化这个过程?我正在考虑循环,但我不知道从哪里开始。
感谢您的帮助。
答案 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])
输出:
此外,您可以连接所有所需的列:
pd.concat([df[n1].div(df[n2]).rename(f'{n1}/{n2}') for n1, n2 in pattern()], 1)
输出:
答案 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)})