大熊猫从2 df划分行

时间:2017-12-20 17:42:22

标签: pandas dataframe division

是否通过匹配列在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

谢谢! :)

3 个答案:

答案 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)