Python 将数据帧的每n个索引乘以(或除以)数组中的常数

Python 将数据帧的每n个索引乘以(或除以)数组中的常数,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据帧,我想用数组中的特定数字乘以(或除以)每n个索引。下面是一个简单的例子,字母只是数字 df= 数据帧(或numpy数组): 我希望获得以下结果: 结果= 0 1 0 A/W B/X 1 C/Y D/Z 2 E/W F/X 3 G/Y H/Z 4 I/W J/X 5 K/Y L/Z 6 M/W N/X 7 O/Y P/Z 使用df.groupy(df%2).agg()或df.groupy(df%2).apply()解决这个问题有什么办法

我有一个数据帧,我想用数组中的特定数字乘以(或除以)每n个索引。下面是一个简单的例子,字母只是数字

df=

数据帧(或numpy数组):

我希望获得以下结果:

结果=

   0     1
0  A/W  B/X
1  C/Y  D/Z
2  E/W  F/X
3  G/Y  H/Z
4  I/W  J/X
5  K/Y  L/Z
6  M/W  N/X
7  O/Y  P/Z
使用
df.groupy(df%2).agg()
df.groupy(df%2).apply()解决这个问题有什么办法吗?我正在处理一个巨大的数据帧,我相信如果我应用for循环将花费比需要更多的时间

我知道我必须使用一个函数,但我不能编写一个能满足我需要的函数


谢谢。

这应该可以在不需要循环或使用apply:

df.iloc[::2, 0] = df.iloc[::2, 0] / df2.iloc[0, 0]
df.iloc[1::2, 0] = df.iloc[1::2, 0] / df2.iloc[0, 1]
df.iloc[::2, 1] = df.iloc[::2, 1] / df2.iloc[1, 0]
df.iloc[1::2, 1] = df.iloc[1::2, 1] / df2.iloc[1, 1]
这也可以工作,并且可以与任意数量的列一起使用:

df.iloc[::2, :] = df.iloc[::2, :] / df2.iloc[0, :]
df.iloc[1::2, :] = df.iloc[1::2, :] / df2.iloc[1, :]

您可以按如下方式修改第一个数据帧的索引:

df.index=df.index%2

然后在索引上合并:

df = df.join(df2, lsuffix='_l', rsuffix = '_r')
那么你想要的是这样的东西

df['ratio1'] = df['0_l'] / df['0_r']
df['ratio2'] = df['1_l'] / df['1_r']
要获得答案的确切形式,请执行以下操作:

column_map = {'ratio1': 0, 'ratio2': 1}
df = df[['ratio1', 'ratio2']].rename(columns= column_map)

请尝试以下代码:

首先定义要应用于每个组的函数:

def dv(tbl):
    return tbl.divide(df2.values, axis='columns')
df2
转换为基础的
以“释放” 从索引对齐开始

然后我们读取df2中的行数(组的大小) 在df分组中):

然后,可以使用单个指令执行实际除法:

df.groupby(np.arange(len(df.index)) // len2).apply(dv)
np.arange(len(df.index))//len2
df
划分为 包含与
df2
相同行数的组

每个组都应用了
dv
功能(定义见上文)

出于测试目的,我创建了第一个数据帧(df),如下所示:

第二个(df2)为:

结果是:

           0         1
0   5.000000  4.400000
1   4.000000  3.714286
2   7.000000  6.000000
3   5.333333  4.857143
4   9.000000  7.600000
5   6.666667  6.000000
6  11.000000  9.200000
7   8.000000  7.142857
当然,上面的代码是分区代码

如果要乘法,请定义一个函数:

def ml(tbl):
    return tbl.multiply(df2.values, axis='columns')
并应用它调用:

df.groupby(np.arange(len(df.index)) // len2).apply(ml)
      0     1
0  10.0  11.0
1  12.0  13.0
2  14.0  15.0
3  16.0  17.0
4  18.0  19.0
5  20.0  21.0
6  22.0  23.0
7  24.0  25.0
     0    1
0  2.0  2.5
1  3.0  3.5
           0         1
0   5.000000  4.400000
1   4.000000  3.714286
2   7.000000  6.000000
3   5.333333  4.857143
4   9.000000  7.600000
5   6.666667  6.000000
6  11.000000  9.200000
7   8.000000  7.142857
def ml(tbl):
    return tbl.multiply(df2.values, axis='columns')
df.groupby(np.arange(len(df.index)) // len2).apply(ml)