是否通过匹配列在2个dfs之间执行行划分。例如,
DF1:
Name 1 2 3 5 Total
-----------------------------
A 2 2 2 2 8
B 1 1 1 1 4
C 0 1 2 3 6
DF2:
Alias 1 2 3 4 Total
-----------------------------
X 5 5 5 5 20
Y 10 10 0 0 20
Z 1 2 3 4 10
结果将是:
[R
NewName 1 2 3 4 5 Total
---------------------------------------- (These rows will be set manually)
I 2/5 2/5 2/5 0/5 - 8/20 <---I = A/X
J 1/5 1/5 1/5 0/5 - 4/20 <---J = B/X
K 1/10 1/10 - - - 4/20 <---K = B/Y
L 0/5 1/5 2/5 0/5 - 6/20 <---L = C/X
谢谢! :)
答案 0 :(得分:1)
这需要一个参与的解决方案,但可以完成。首先,声明您的手动控制参数。
i = ['A', 'B', 'B', 'C']
j = ['X', 'X', 'Y', 'X']
k = ['I', 'J', 'K', 'L']
现在,我们的想法是调整两个数据帧。
x = df1.set_index('Name')
y = df2.set_index('Alias')
x, y = x.align(y)
执行除法,并创建新的数据帧。由于我们要分割numpy数组,您可能会遇到运行时警告。别理他们。
z = x.reindex(i, axis=0).values / y.reindex(j, axis=0).values
df = pd.DataFrame(z, index=k, columns=x.columns)
df
1 2 3 4 5 Total
I 0.4 0.4 0.400000 NaN NaN 0.4
J 0.2 0.2 0.200000 NaN NaN 0.2
K 0.1 0.1 inf NaN NaN 0.2
L 0.0 0.2 0.400000 NaN NaN 0.3
编辑;在旧版本上,reindex
不接受axis
参数。在这种情况下,请使用
z = x.reindex(index=i).values / y.reindex(index=j).values
此外,要填写非有限值,请使用np.isfinite
-
df[np.isfinite(df)].fillna('-')
1 2 3 4 5 Total
I 0.4 0.4 0.4 - - 0.4
J 0.2 0.2 0.2 - - 0.2
K 0.1 0.1 - - - 0.2
L 0.0 0.2 0.4 - - 0.3
答案 1 :(得分:1)
I = df1.T['A']/df2.T['X']
J = df1.T['B']/df2.T['X']
K = df1.T['B']/df2.T['Y']
L = df1.T['C']/df2.T['X']
df = pd.concat([I, J, K, L], axis=1).rename(columns={0:'I', 1:'J', 2:'K', 3:'L'}).T
然后,让它看起来更像你想要的输出:
df[np.isfinite(df)].fillna('-')
-
修改的
更普遍的是,为了不进行级联划分,你可以这样做:
pairs = [('A','X'), ('B','X'), ('B','Y'), ('C','X')]
series_to_concat = [df1.T[col_df1]/df2.T[col_df2] for (col_df1, col_df2) in pairs]
names = ['I', 'J', 'K', 'L']
col_names = {col_num : name for col_num, name in enumerate(names)}
df = pd.concat(series_to_concat, axis=1).rename(columns=col_names).T
答案 2 :(得分:-1)
看起来你不关心指数所以这应该有效。
r = df1.reset_index(drop=True) / df2.reset_index(drop=True)