【问题标题】:Python Pandas Memory Error during Drop丢弃期间的 Python Pandas 内存错误
【发布时间】:2017-03-15 20:07:11
【问题描述】:

我有 825468 行的 df。 我正在执行此操作。

  frame = frame.drop(frame.loc[(
            frame['RR'].str.contains(r"^([23])[^-]*-\1[^-]*$")), 'RR'].str.replace("[23]([^-]*)-[23]([^-]*)", r"\1-\2").isin(
             series1.str.replace("1([^-]*)-1([^-]*)", r"\1-\2"))[lambda d: d].index)

在哪里

  series1 = frame.loc[frame['RR'].str.contains("^1[^-]*-1"), 'RR']

它是做什么的

准备一系列RR 具有类似1abc-1bcd 的值,然后如果在框架中有一个RR,如2abc-2bcd,在替换后变为abc-bcd,并且它在替换后也有串联,它掉了。

但它会产生内存错误。有没有更有效的方法来执行相同的操作。

例如

如果在 df 中 ..

     RR
0    2abc-2abc
1    1abc-1abc
2    3abc-3abc
3    2def-2def
4    3def-3def
5    def-dfd
6    sdsd-sdsd
7    1def-1def

然后从这个框架中删除2abc-2abc3abc-3abc,因为删除2,3后它变成abc-abc,当我们从1abc-1abc中删除1时它也是abc-abc.2def-2def不应该被丢弃,因为没有1def-1def

输出:

     RR
0    1abc-1abc
1    def-dfd
2    sdsd-sdsd
3    1def-1def

【问题讨论】:

    标签: python python-2.7 pandas dataframe filtering


    【解决方案1】:

    更新 2:

    In [176]: df
    Out[176]:
              RR
    0  2abc-2abc
    1  3abc-3abc
    2  2def-2def
    3  3def-3def
    4    def-dfd
    5  sdsd-sdsd
    6  1def-1def
    7    abc-abc
    8    def-def
    
    In [177]: df[['d1','s','s2']] = df.RR.str.extract(r'^(?P<d1>\d+)(?P<s1>[^-]*)-\1(?P<s2>[^-]*)', expand=True)
    
    In [178]: df
    Out[178]:
              RR   d1    s   s2
    0  2abc-2abc    2  abc  abc
    1  3abc-3abc    3  abc  abc
    2  2def-2def    2  def  def
    3  3def-3def    3  def  def
    4    def-dfd  NaN  NaN  NaN
    5  sdsd-sdsd  NaN  NaN  NaN
    6  1def-1def    1  def  def
    7    abc-abc  NaN  NaN  NaN
    8    def-def  NaN  NaN  NaN
    
    In [179]: df.s += df.pop('s2')
    
    In [180]: df
    Out[180]:
              RR   d1       s
    0  2abc-2abc    2  abcabc
    1  3abc-3abc    3  abcabc
    2  2def-2def    2  defdef
    3  3def-3def    3  defdef
    4    def-dfd  NaN     NaN
    5  sdsd-sdsd  NaN     NaN
    6  1def-1def    1  defdef
    7    abc-abc  NaN     NaN
    8    def-def  NaN     NaN
    
    In [181]: result = df.loc[~df.s.isin(df.loc[df.d1 == '1', 's']) | (~df.d1.isin(['2','3'])), 'RR']
    
    In [182]: result
    Out[182]:
    0    2abc-2abc
    1    3abc-3abc
    4      def-dfd
    5    sdsd-sdsd
    6    1def-1def
    7      abc-abc
    8      def-def
    Name: RR, dtype: object
    

    更新:

    In [171]: df
    Out[171]:
              RR
    0  2abc-2abc
    1  1abc-1abc
    2  3abc-3abc
    3  2def-2def
    4  3def-3def
    5    def-dfd
    6  sdsd-sdsd
    7  1def-1def
    8    abc-abc
    

    注意:我有意添加了 8th 行:abc-abc,不应删除(如果我正确理解您的问题)

    解决方案 1: 使用 .str.replace()drop_duplicates() 方法:

    In [178]: (df.sort_values('RR')
         ...:    .RR
         ...:    .str.replace("[23]([^-]*)-[23]([^-]*)", r"1\1-1\2")
         ...:    .drop_duplicates()
         ...: )
         ...:
    Out[178]:
    1    1abc-1abc
    7    1def-1def
    8      abc-abc
    5      def-dfd
    6    sdsd-sdsd
    Name: RR, dtype: object
    

    解决方案 2: 使用 .str.replace().str.contains() 方法和布尔索引:

    In [172]: df.loc[~df.sort_values('RR')
         ...:           .RR
         ...:           .str.replace("[23]([^-]*)-[23]([^-]*)", r"_\1-_\2")
         ...:           .str.contains(r"^_[^-]*-_")]
         ...:
    Out[172]:
              RR
    1  1abc-1abc
    5    def-dfd
    6  sdsd-sdsd
    7  1def-1def
    8    abc-abc
    

    注意:您可能希望将 '_' 替换为另一个符号,这将永远不会出现在 RR 列中

    【讨论】:

    • @vks,您的意思是将'\d+' 更改为'[123]+' 将无法正常工作(根据您的需要)?
    • 是的,因为序列没有定义......1abc-1abc不应该被删除。如果它在2abc-2abc之后,它也会被删除rt
    • 尚未测试......但看起来不错......不需要额外的系列......但是大约有 800000 行......这不应该导致内存错误
    • 另外我认为如果 1abc-1abc 不在框架中,它仍会将 2abc-2abc 替换为 1abc-1abc rt ?
    • @vks,“解决方案 2”怎么样 - 它工作正常吗?
    猜你喜欢
    • 2023-04-02
    • 2022-06-27
    • 2018-03-27
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多