我试图按列分隔所有列但只有一次(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
我无法找到关于此事的线索。
我该如何解决?
谢谢!
答案 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
获取idx0
和idx1
的替代方法 -
from itertools import combinations
idx0,idx1 = np.array(list(combinations(range(df.shape[1]),2))).T