我正在使用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'}
似乎没什么用。请帮忙!
答案 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