python - 如何将数据帧行乘以基于行的 'attribute' 的数组?

标签 python pandas numpy dataframe

我有一个 Pandas 数据框 DF,它几乎占用了我所有的 RAM。 它的索引始终是以下之一:“c1”、“c2”、“c3”。

    0   1   2  ...  n
i            
c1  1   8  15
c2  2   9  16
c1  3  10  17
c3  4  11  18
c2  5  12  19
c1  6  13  20
c3  7  14  21
...

我还有一个字典,其中的键与数据帧索引标签“匹配”。这些值是长度为 n 的列表/数组(等于数据帧列数)。

d = {'c1':[10,10,10,...],'c2':[100,100,100,...],'c3':[1000,1000,1000,...]}

len(d[<allkeys>]) == n >>> True

我想要做的是基于行的“属性”的简单数据帧乘法——在本例中是它的索引,但它可能是列中的值。 结果如下所示:

       0      1      2
i                     
c1    10     80    150
c2   200    900   1600
c1    30    100    170
c3  4000  11000  18000
c2   500   1200   1900
c1    60    130    200
c3  7000  14000  21000

我不想以 DF*DF2 的方式构建第二个数据帧 DF2,因为我没有足够的 RAM,而且这样的数据帧对我来说似乎毫无意义,这意味着它只是一个数组/列表的重复(如果我错了,请纠正我)。

我考虑过有第二个这样的数据框:

       0     1     2
c1    10    10    10
c2   100   100   100
c3  1000  1000  1000

但是当我执行 DF * DF2 时,索引会以某种方式进行排序,我不知道如何避免这种情况。 结果:

          0         1         2
c1      100       800      1500
c1      300      1000      1700
c1      600      1300      2000
c2    20000     90000    160000
c2    50000    120000    190000
c3  4000000  11000000  18000000
c3  7000000  14000000  21000000

如果您认为有另一种方法可以解决这个问题(不同的数据结构、库等),我们也将不胜感激。

示例代码:

df = pd.DataFrame({0: [1, 2, 3, 4, 5, 6, 7],1: [8, 9, 10, 11, 12, 13, 14], 2: [15, 16, 17, 18, 19, 20, 21]}, index=pd.Index(['c1', 'c2', 'c1', 'c3', 'c2', 'c1', 'c3'], dtype='object', name='i'))
d = {'c1':[10,10,10],'c2':[100,100,100],'c3':[1000,1000,1000]}
df2 = pd.DataFrame.from_dict(d,orient='index')

最佳答案

想法是按 DataFrame.set_index 删除重复索引,乘以 DataFrame.mul按第一级,最后按 DataFrame.reset_index 删除第二级:

df1 = (df.set_index(np.arange(len(df)), append=True)
         .mul(df2, level=0)
         .reset_index(level=1, drop=True))
print (df1)
       0      1      2
i                     
c1    10     80    150
c2   200    900   1600
c1    30    100    170
c3  4000  11000  18000
c2   500   1200   1900
c1    60    130    200
c3  7000  14000  21000

关于python - 如何将数据帧行乘以基于行的 'attribute' 的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60566053/

相关文章:

python - 如何从命令行使用 JSBeautify?

python - 如何计算多列中相同值的个数?

python - 从类中的 sql 填充输入框

python - 二维数组python中的邻居

python - 如何使用 ON DUPLICATE KEY UPDATE 正确增加变量

python - 在 PDB 交互式 shell 中打印当前异常

python - Concurrent.futures : what are the use cases for map() vs. 提交()?

python 的 .replace 留下空行

python - 如何根据行值合并两个大小不等的DataFrame

python - 无法估计参数的 Scipy 协方差。为类似的数据工作,为什么不使用这个数据。