【问题标题】:Mapping Values in a pandas Dataframe column?熊猫数据框列中的映射值?
【发布时间】:2016-12-07 20:49:32
【问题描述】:

我正在尝试过滤掉一些数据,但似乎遇到了一些错误。 此语句下方是我拥有的以下代码的副本:

 url = "http://elections.huffingtonpost.com/pollster/2012-general-election-romney-vs-obama.csv"
 source = requests.get(url).text
 s = StringIO(source)
 election_data = pd.DataFrame.from_csv(s, index_col=None).convert_objects(
        convert_dates="coerce", convert_numeric=True)
 election_data.head(n=3)
 last_day = max(election_data["Start Date"])
 filtered = election_data[((last_day-election_data['Start Date']).days <= 5)]

如您所见,last_day 是election_data 列中的最大值 我想过滤掉数据之间的差异 max 和 x 小于或等于 5 天 我尝试过使用 for - 循环和列表理解的各种组合。

 filtered = election_data[map(lambda x: (last_day - x).days <= 5, election_data["Start Date"]) ]

这行通常可以工作,但是 python3 给了我以下错误:

 <map object at 0x10798a2b0> 

【问题讨论】:

  • 对于python 3需要添加list - filtered = election_data[list(map(lambda x: (last_day - x).days &lt;= 5, election_data["Start Date"]))]
  • 查看更好的解释here
  • 这不是错误。

标签: python python-3.x pandas numpy dataframe


【解决方案1】:

您的第一次尝试几乎是正确的。问题是

(last_day - election_date['Start Date']).days

应该是

(last_day - election_date['Start Date']).dt.days

Series 对象没有days 属性,只有TimedeltaIndex 对象有。下面是一个完整的工作示例。

data = pd.read_csv(url, parse_dates=['Start Date', 'End Date', 'Entry Date/Time (ET)'])
data.loc[(data['Start Date'].max() - data['Start Date']).dt.days <= 5]

请注意,我使用了Series.max,它比内置的max 性能更高。此外,data.loc[mask]data[mask] 稍快一些,因为它的过载较少(具有更专业的用例)。

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您只想过滤您的数据,其中任何Start Date 值距最后一天 &lt;=5 天。这听起来像是 pandas 索引可以轻松处理的事情,使用 .loc

    如果您想要一个包含过滤数据的全新 DataFrame 对象:

    election_data # your frame
    last_day = max(election_data["Start Date"])
    date = # Your date within 5 days of the last day
    new_df = election_data.loc[(last_day-election_data["Start Date"]<=date)]
    

    或者,如果您只想要 Start Date 列后过滤:

    last_day = max(election_data["Start Date"])
    date = # Your date within 5 days of the last day
    filtered_dates = election_data.loc[(last_day-election_data["Start Date"]<=date), "Start Date"]
    

    请注意,您的date 变量必须是您的日期,格式为Start Date 要求的格式(可能是YYYYmmdd 格式?)。如果您不知道这个变量应该是什么,那么只需 print(last_day) 然后倒数 5 天。

    【讨论】:

    • last_day-election_data["Start Date"]&lt;=5 不是有效的比较。左侧是timedelta64[ns] 中的Series,不能与整数进行比较。
    • 请注意@IgorRaush。完全忘记了日期的格式。更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2018-10-10
    • 2019-01-02
    • 2022-11-18
    • 2017-05-13
    • 1970-01-01
    • 2019-07-12
    相关资源
    最近更新 更多