【问题标题】:showing multiple data which meets certain conditions-issue in PANDAS在PANDAS中显示满足某些条件问题的多个数据
【发布时间】:2016-11-17 14:16:38
【问题描述】:

我正在使用 Python 在 PANDAS 中工作,并且正在查看天气 CSV 文件。我可以毫无问题地从中提取数据。但是,我无法提取符合某些标准的数据,例如何时显示哪些日子的温度高于 100 度。

到目前为止,我的代码是这样的:

import pandas as pd
import numpy as np 
import matplotlib.pyplot as plt 

df = pd.read_csv('csv/weather.csv')

print(df[[df.MaxTemperatureF > 100 ]])

最后一行是我认为我遇到问题的地方。执行以下步骤后,我现在得到的错误回溯如下:

Traceback (most recent call last):
File "weather.py", line 40, in <module>
print(df[df['MaxTemperatureF' > 100]])
TypeError: unorderable types: str() > int()
Mikes-MBP-2:dataframes mikecuddy$ python3 weather.py
Traceback (most recent call last):
File "weather.py", line 41, in <module>
print(df[[df.MaxTemperatureF > 100 ]])
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-     
packages/pandas/core/frame.py", line 1991, in __getitem__
return self._getitem_array(key)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-  
packages/pandas/core/frame.py", line 2028, in _getitem_array
(len(key), len(self.index)))
 ValueError: Item wrong length 1 instead of 360.

我一直在做一个教程:http://www.gregreda.com/2013/10/26/working-with-pandas-dataframes/ 同样任何帮助都会很棒!谢谢!

df.info() 信息:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 360 entries, 0 to 359
Data columns (total 23 columns):
PST                           360 non-null object
MaxTemperatureF               359 non-null float64
Mean TemperatureF             359 non-null float64
Min TemperatureF              359 non-null float64
Max Dew PointF                359 non-null float64
MeanDew PointF                359 non-null float64
Min DewpointF                 359 non-null float64
Max Humidity                  359 non-null float64
Mean Humidity                359 non-null float64
Min Humidity                 359 non-null float64
Max Sea Level PressureIn     359 non-null float64
Mean Sea Level PressureIn    359 non-null float64
Min Sea Level PressureIn     359 non-null float64
Max VisibilityMiles          355 non-null float64
Mean VisibilityMiles         355 non-null float64
Min VisibilityMiles          355 non-null float64
Max Wind SpeedMPH            359 non-null float64
Mean Wind SpeedMPH           359 non-null float64
Max Gust SpeedMPH            211 non-null float64
PrecipitationIn               360 non-null float64
CloudCover                   343 non-null float64
Events                       18 non-null object
WindDirDegrees               360 non-null int64
dtypes: float64(20), int64(1), object(2)
memory usage: 64.8+ KB
None

【问题讨论】:

  • 对于第一个问题, print(df[df['MaxTemperatureF'] > 100 ]) 应该是你要找的。我不明白你的其他问题,你不能在过滤后调用 head() 吗?
  • 也许最高温度存储为字符串?
  • 是的,我得到的错误信息是: Traceback (last recent call last): File "weather.py", line 36, in print(df[df['MaxTemperatureF' > 100]]) TypeError: unorderable types: str() > int() 但是不确定 int() 的确切放置位置
  • 你试过在没有header=None的情况下导入数据吗?
  • 回复:ValueError: Item wrong length 1 instead of 360.。删除双括号:df[df.MaxTemperatureF &gt; 100]

标签: python-3.x csv pandas


【解决方案1】:

对于最高温度,您可以指定一个转换器函数:

df = pd.read_csv('csv/weather.csv', converters={'MaxTemperatureF':float})

编辑:正如@ptrj 在评论中提到的,您可以这样做以将np.nan 替换为MaxTemperatureF 列中的字符串值:

df = pd.read_csv('csv/weather.csv', 
                 converters={'MaxTemperatureF':
                             lambda x: try: return float(x); 
                                       except ValueError: return np.nan;})

Edit2:@ptrj 的解决方案,因为他无法在评论中写出来...

def my_conv(x): 
    try: 
        return float(x)
    except ValueError: 
        return np.nan

df = pd.read_csv('csv/weather.csv', converters={'MaxTemperatureF': my_conv})

其他:

  • 如果 csv 文件的第一行有标题,则不要传递 header=0
  • 既然你已经有了标题,现在你不需要指定cols=...
  • 默认的sep 是','所以你不需要指定。

【讨论】:

  • 当我执行 df = pd.read_csv('csv/weather.csv', converters={'MaxTemperatureF':float}) 我收到此错误消息: ValueError: could not convert string to float:
  • 里面一定有字符串。你能清理一下源文件吗?
  • 也许这会有所帮助:converters={'MaxTemperatureF': my_conv},其中def my_conv(x): try: return float(x); except: return np.nan
  • @MikeCuddy 将my_conv 的定义正确缩进(不带分号)。我不能在评论中这样做。
  • 是的,我正确输入了 my_conv,但是,我确实解决了问题。在 print(df[[df.MaxTemperatureF > 100 ]]) 我有一组额外的括号。它应该是 print(df[df.MaxTemperatureF > 100 ])
【解决方案2】:

试试这个:你有 '()" 而不是 []。

print(df[df.MaxTemperatureF.astype(float) > 100 ])

注释:

df.isnull().sum() 
df.dropna()
df.fillna(0) 

【讨论】:

  • 仍然收到 ValueError:无法将字符串转换为浮点数:错误消息
  • 运行:df.isnull().sum() 检查 null 或 nan.. 这可能是刺痛,然后尝试 dropna() 删除 -- 但你可以填充na(0)保留数据,但将 nan 替换为“0”
猜你喜欢
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
相关资源
最近更新 更多