Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.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
Python 如何根据';属性';排在第一位?_Python_Pandas_Numpy_Dataframe - Fatal编程技术网

Python 如何根据';属性';排在第一位?

Python 如何根据';属性';排在第一位?,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我有一个大熊猫数据帧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(等于数据帧列数)的列表/数组 我不想以一种我可以

我有一个大熊猫数据帧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(等于数据帧列数)的列表/数组

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

我考虑过使用第二个数据帧,如下所示:

       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
       0     1     2
c1    10    10    10
c2   100   100   100
c3  1000  1000  1000
但当我使用DF*DF2时,不知怎么索引会被排序,我不知道如何避免这种情况。 结果:

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

样本代码:

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')

Idea是重复数据消除,按索引,按第一级进行多次,最后按第二级进行删除:


作为一个必须在内存不足的系统上工作的老恐龙,我会做我们过去在内存中加载所有内容时所做的事情:我只会将数据帧分块处理,将不需要在实时内存中的内容保存到磁盘

因此,我想:

  • 将大数据帧保存到磁盘上的csv文件中,并将其从内存中清除
  • 打开该csv文件以按块读取
  • 打开新的csv文件以保存结果(带有数据帧的空副本)
  • 然后逐块:
    • 读一段
    • 处理它
    • 将其附加到新的csv文件中

当然没有购买更多内存的效率高,但是健壮且可扩展。

我只想说两点:我有一个大熊猫数据帧DF,它几乎占用了我所有的RAM:坏主意,因为熊猫需要内存来运行。它的索引总是下列之一:“c1”、“c2”、“c3”:这是个坏主意,因为不唯一的索引通常是以后噩梦的起点。@SergeBallesta非唯一索引背后的理由是,它允许我执行我正在寻找的操作。不过,感谢您指出这一点——我做了一个快速搜索,它似乎确实对性能有一些影响。
          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')
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