gpt4 book ai didi

Python Pandas 删除过程中出现内存错误

转载 作者:太空宇宙 更新时间:2023-11-03 16:00:17 27 4
gpt4 key购买 nike

我的 df 为 825468 行。我正在对其执行此操作。

  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 之类的值,然后如果在帧中存在诸如 2abc 之类的 RR -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-abc2def-2def 不应该是由于没有 1def-1def

而被丢弃

输出:

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

最佳答案

更新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() 方法和 bool 索引:

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 列中

关于Python Pandas 删除过程中出现内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40381181/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com