在Python中从df列中删除字符串

时间:2018-01-26 18:51:34

标签: python pandas dataframe

我正在使用python3 jupyter笔记本。

我正在尝试对数据框中由美元金额组成的列进行一些数值计算。有些行有“$ - ”而不是数字。如何告诉python忽略这些行,以便查看有效数据?

电影是我的数据帧 收入是我正在看的专栏

class UniversityUpdateView(UserPassesTestMixin,UpdateView):
    def test_func(self):
    return self.request.user.administrators_set.filter(pk=self.get_object().pk).exists()
    model = University
    form_class = UniversityForm
    template_name='university_form.html'

我得到这种类型的输出:

set(movie['revenue'])

到目前为止,我尝试过几种方法:

{' $-   ',
 '1',
 '10',
 '100',
 '10000',
 '97250400',
 '98000000',
 '99000000'}

似乎没什么用。请帮忙!

4 个答案:

答案 0 :(得分:2)

这是一种方式。

import pandas as pd

df = pd.DataFrame([[' $-   '], ['1'], ['10'], ['100'],
                   ['10000'], ['97250400'], ['98000000'],
                   ['99000000']], columns=['A'])

df['A'] = df['A'].apply(pd.to_numeric, errors='coerce')

df.dtypes

# A    float64
# dtype: object

答案 1 :(得分:0)

我认为处理此问题的两种方式。

鉴于:

import pandas as pd
df = pd.DataFrame({'A':['12','$10','22','$99','100']})
df
    A
0   12
1  $10
2   22
3  $99
4  100

1)强制pandas.to_numeric(...)无法转换为Nans的值。这样大多数计算都会忽略它们。

pd.to_numeric(df.A, errors='coerce')
0     12.0
1      NaN
2     22.0
3      NaN
4    100.0

2)删除'$'(如果存在)并转换为数字,这样您就不会丢失数据。

df.A.apply(lambda i: float(i[1:]) if i[0] == '$' else float(i)) 
0     12.0
1     10.0
2     22.0
3     99.0
4    100.0

答案 2 :(得分:0)

您还可以创建一个遮罩来忽略这些行:

<div class='cycle_questions' style='display:inline-block;border:1px solid red;width:100px;height:40px;'></div>
<div class='cycle_research' style='display:inline-block;border:1px solid green;width:100px;height:40px;'></div>
如果字符串中的所有字符都是数字,则

str.isdigit()返回import pandas as pd movie = pd.DataFrame( { 'revenue': [' $- ','1','10','100','10000','97250400','98000000','99000000'] } ) print(movie[movie['revenue'].map(str.isdigit)]) # revenue #1 1 #2 10 #3 100 #4 10000 #5 97250400 #6 98000000 #7 99000000

因此True将返回与movie['revenue'].map(str.isdigit)长度相同的pandas.Series(掩码),其布尔值指示值是否为数字。

然后movie返回一个新的movie[movie['revenue'].map(str.isdigit)],其中只有掩码为pd.DataFrame的行。

<强>更新

如果您提前知道错误值将始终是特定字符串,例如True,您只需执行以下操作:

' $-   '

这更快,因为逻辑运算符是矢量化的(AFAIK),您可以避免调用movie[movie['revenue'] != ' $- '] apply()

更新2

docs的另一种方法:

map()

答案 3 :(得分:0)

以下是从列表中删除包含'$'的元素的通用解决方案:

tmp = movie['revenue']
for elt in movie['revenue']:
    if elt.find('$') != -1:
        tmp.remove(elt)
movie['revenue'] = tmp