Python 将数据帧的每n个索引乘以(或除以)数组中的常数
我有一个数据帧,我想用数组中的特定数字乘以(或除以)每n个索引。下面是一个简单的例子,字母只是数字 df= 数据帧(或numpy数组): 我希望获得以下结果: 结果=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()解决这个问题有什么办法
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)