df.replace不替换]

时间:2019-02-13 21:26:37

标签: python pandas

我有一个数据框,我正在尝试从中删除[]。看起来像这样:

dftest = pd.DataFrame({'col1': ['A', 'B'],
         'col2': ['[1, 5, 30]', '[1, 10, 20]']})

我可以使用以下方法删除[

dftest = dftest.replace({'\[':''}, regex = True)

但是,当我为]尝试相同的操作时,没有任何内容被删除:

dftest = dftest.replace({'\]':''}, regex = True)

如何删除最后的]?为什么它不能与[一样工作?所需的输出:

dftest = pd.DataFrame({'col1': ['A', 'B'],
         'col2': ['1, 5, 30', '1, 10, 20']})

在Jupyter Lab的新单元格中运行此确切的操作将返回没有更改的数据框:

dftest = pd.DataFrame({'col1': ['A', 'B'],
         'col2': ['[1, 5, 30]', '[1, 10, 20]']})
dftest = dftest.replace({'\]':''}, regex = True)

但是,运行此确实替换[

dftest = pd.DataFrame({'col1': ['A', 'B'],
         'col2': ['[1, 5, 30]', '[1, 10, 20]']})
dftest = dftest.replace({'\]':''}, regex = True)

也许我的Jupyter实验室有问题??这是这两个代码段的屏幕截图,并带有它们的输出,以防万一(我想我的笔记本上正在发生奇怪的事情):

enter image description here

1 个答案:

答案 0 :(得分:0)

还有另一种解决方案,请使用literal_eval库中的ast

代码:

import pandas as pd
from ast import literal_eval

dftest = pd.DataFrame({'col1': ['A', 'B'],
                       'col2': ['[1, 5, 30]', '[1, 10, 20]']})
print(dftest)
# print(dftest.col2.dtype)
D = dftest.at[0, 'col2']
print(type(D))  # taking particular cell
dftest['col2'] = dftest['col2'].apply(literal_eval)
D = dftest.at[0, 'col2']  # taking particular cell
print(type(D))

输出:

  col1         col2
0    A   [1, 5, 30]
1    B  [1, 10, 20]
<class 'str'>
<class 'list'>

例如:

from ast import literal_eval
print(literal_eval('[1, 5, 30]'))
print(type('[1, 5, 30]'))
print(type(literal_eval('[1, 5, 30]')))

输出:

[1, 5, 30]
<class 'str'>
<class 'list'>