Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 从2 df开始划分行的熊猫_Pandas_Dataframe_Division - Fatal编程技术网

Pandas 从2 df开始划分行的熊猫

Pandas 从2 df开始划分行的熊猫,pandas,dataframe,division,Pandas,Dataframe,Division,是否通过匹配列在两个dfs之间执行行划分。比如说, df1: df2: 结果将是: r NewName 1 2 3 4 5总计 ----------------------------------------(这些行将手动设置) I 2/5 2/5 2/5 0/5-8/20看起来你不在乎指数,所以这应该是可行的 r = df1.reset_index(drop=True) / df2.reset_index(drop=True) 这需要一个复杂的解决方案,但可以做到。首先,声明手动控制的参数

是否通过匹配列在两个dfs之间执行行划分。比如说,

df1:

df2:

结果将是:

r

NewName 1 2 3 4 5总计
----------------------------------------(这些行将手动设置)

I 2/5 2/5 2/5 0/5-8/20看起来你不在乎指数,所以这应该是可行的

r = df1.reset_index(drop=True) / df2.reset_index(drop=True)

这需要一个复杂的解决方案,但可以做到。首先,声明手动控制的参数

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
不接受轴
参数。在这种情况下,使用

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
然后,为了使它看起来更像您想要的输出:

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


什么决定了进行除法的对应行?我想手动控制这可能在问题本身中。如果你想在位置上匹配,你可以使用np.divide(df1.values,df2.values)我想第四列也应该是空的?因为,第4列和第5列在相应的数据帧中没有等价物(请参见我的答案)。谢谢,但如果两个dfs中的所有位置都匹配,这将起作用。但是,我的不需要,因为我需要在两个dfs中除以某些特定的行。为什么不这样说?很抱歉confusion@COLDSPEED列=c?c来自哪里?我还得到了这个错误:TypeError:reindex()得到了一个意外的关键字参数“axis”@TylerNG哇,对不起,这是调试的产物。现在看一看。@TylerNG那个错误。。。。这是因为你使用的是旧版本。使用
index=j
index=i
并删除轴参数。@TylerNG基本上,
x.reindex(index=i).values/y.reindex(index=j).values
这是v0.21之前的操作方法。一如既往!这是特定于此处显示的示例数据的。您可以将
('A','X')
等元组放在一个列表中,然后进行列表理解,如果您想更“通用”。如果我认为这个答案适用于任何类似的
df
,只要列提供正确(当然也必须提供名称,但这不是这里的大问题),那我错了吗?你可以随心所欲地实现一个解决方案,但如果目标是简单易读,那么你就无法达到目的;-)我不确定这里有什么问题?我看到你在暗示它既不简单也不可读?它基本上是设置(必须以某种方式完成)+非常清晰的一行程序。问题是,你正在级联4个单独的除法运算,然后声称你可以用一个循环来简化它。我想说的是,这不是做事的最佳方式。我只是给你反馈而已。
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
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