【问题标题】:Compare two different pandas dataframes and drop rows Python比较两个不同的 pandas 数据框并删除行 Python
【发布时间】:2017-01-24 14:58:25
【问题描述】:

我正在努力解决以下问题。我有两个数据框 df1 和 df2 并希望通过列运输选择然后从 df1 国家和 drom 每个国家定义的日期来比较它们,如下面的代码所示。如果这样做,我会收到以下错误消息:

ValueError: 只能比较标签相同的 Series 对象

代码如下所示:

from pandas.tseries.holiday import (
AbstractHolidayCalendar, EasterMonday,
GoodFriday, Holiday, next_monday,
Easter, nearest_workday, Day, USMartinLutherKingJr,
USPresidentsDay, USMemorialDay, USLaborDay,
USThanksgivingDay)

class GermanHoliday(AbstractHolidayCalendar):
    rules = [
             Holiday('New Years Day', month=1, day=1, observance=next_monday),
             GoodFriday,
             EasterMonday,
             Holiday('Reformation Day', year=2017, month=10, day=31, observance=nearest_workday),
             Holiday('Labour Day', month=5, day=1, observance=nearest_workday),
             Holiday('Whit Monday', month=1, day=1, offset=[Easter(), Day(50)]),
             Holiday('Day of German Unity', month=10, day=3, observance=nearest_workday),
             Holiday('Christmas Day', month=12, day=25, observance=nearest_workday),
             Holiday('Boxing Day',month=12, day=26, observance=nearest_workday) 
    ]

class USHolidays(AbstractHolidayCalendar):
    rules = [
             Holiday('NewYearsDay', month=1, day=1, observance=nearest_workday),
             USMartinLutherKingJr,
             USPresidentsDay,
             GoodFriday,
             USMemorialDay,
             Holiday('USIndependenceDay', month=7, day=4, observance=nearest_workday),
             USLaborDay,
             USThanksgivingDay,
             Holiday('Christmas Day', month=12, day=25, observance=nearest_workday)
             ]

calendarGermany = GermanHoliday()
calendarUS = USHolidays()

holidaysGermany = calendarGermany .holidays().to_pydatetime()
holidaysUS = calendarUS .holidays().to_pydatetime()

qry = "Transportation in @df1.ticker and Date not in @holidaysGermany "

df2 = df2.query(qry)

数据框df1和df2的结构如下:

df1:

0    transportation  country
1    ICE             Germany
2    Lufthansa       Germany
3    SIXT            Germany
4    TGV             France
5    Air France      France
6    Alamo           France
7    National        USA
8    Amtrak          USA
9    Delta           USA

df2:

   Date         transportation price
0  2015-12-21   ICE            81.9924
1  2015-12-22   ICE            81.5173
2  2015-12-23   ICE            83.5015
3  2015-12-24   ICE            83.5015
4  2015-12-25   ICE            83.5015
5  2015-12-28   ICE            83.0357
6  2015-12-29   ICE            84.6286
7  2015-12-30   ICE            83.7250
8  2015-12-31   ICE            83.7250
9  2016-01-01   ICE            83.7250
10 2015-12-21   National       127.3900
11 2015-12-22   National       129.0000
12 2015-12-23   National       131.8800
13 2015-12-24   National       131.8800
14 2015-12-25   National       131.8800
15 2015-12-28   National       130.0300
16 2015-12-29   National       132.1700
...

最终的结果应该是这样的:

df2:

   Date         transportation price
0  2015-12-21   ICE            81.9924
1  2015-12-22   ICE            81.5173
2  2015-12-23   ICE            83.5015
3  2015-12-24   ICE            83.5015
4  2015-12-28   ICE            83.0357
5  2015-12-29   ICE            84.6286
6  2015-12-30   ICE            83.7250
7  2015-12-31   ICE            83.7250
8  2016-01-01   ICE            83.7250
9  2015-12-21   National       127.3900
10 2015-12-22   National       129.0000
11 2015-12-23   National       131.8800
12 2015-12-26   National       131.8800
13 2015-12-28   National       130.0300
14 2015-12-29   National       132.1700
...

【问题讨论】:

    标签: python datetime dataframe


    【解决方案1】:

    IIUC 你可以这样做:

    In [197]: qry = "transportation in @df1.transportation and \
         ...:        Date not in ['2015-12-24','2015-12-25']"
    
    In [198]: df2.query(qry)
    Out[198]:
             Date transportation     price
    0  2015-12-21            ICE   81.9924
    1  2015-12-22            ICE   81.5173
    2  2015-12-23            ICE   83.5015
    5  2015-12-28            ICE   83.0357
    6  2015-12-29            ICE   84.6286
    7  2015-12-30            ICE   83.7250
    8  2015-12-31            ICE   83.7250
    9  2016-01-01            ICE   83.7250
    10 2015-12-21       National  127.3900
    11 2015-12-22       National  129.0000
    12 2015-12-23       National  131.8800
    15 2015-12-28       National  130.0300
    16 2015-12-29       National  132.1700
    

    【讨论】:

    • 解决了。查询工作完美,只是 @ 缺少 "ticker in @Product_Master_Data_Ticker_Country.ticker and Date not in @holidaysGermany"。但不知何故,我怎样才能使查询县具体?
    • @MCM,我不确定我明白你的意思是什么意思 make the query county specific...
    • 这意味着我有每个国家的假期日历。目前我会过滤所有日期,独立于哪个国家。像if(df1['country'] == 'Germany'): for index, row in df2.iterrows(): if row['Date'] in holidaysGermany: df2.drop(index, inplace=True) elif(df1['country'] == 'USA'): for index, row in df2.iterrows(): if row['Date'] in holidaysUSA: df2.drop(index, inplace=True)这样的东西希望它更清楚吗?
    • 我在上面做了更新。我只需要在查询中包含从 df1 比较国家和交通的查询,并使用 df2 上的日历来删除每个国家/地区的假期。是不是更清楚了?
    猜你喜欢
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多