使用一个DataFrame查找满足另一个DataFrame中条件的行

时间:2020-06-17 10:10:08

标签: python pandas

我正在尝试将维修订单列表放入“每日”数据框,其中包含在商店中开立的维修数量。

The repair table looks like this:
data = [['USA', 2007-01-01, 2007-01-10],
        ['EUR', 2007-01-01, 2007-01-08],
        ['ASIA', 2007-01-02, 2007-01-05],
        ['EUR', 2007-01-07, 2007-0-10]]
columns = ['Location', 'Date In', 'Date Out']
repairs = pd.DataFrame(data, columns=columns)
print(repairs)

我想创建一个数据框,其中包含所有车间以及每天车间中零件的数量。因此输出应如下所示:

locations = repairs['Location'].unique()
dates = pd.date_range(start=2007-01-01, end = 2007-01-11)
locwork = pd.DataFrame(index=dates, columns=locations)
print(locwork)

是否有矢量化的方法来实现这一目标?因为我可以找到的唯一方法是遍历locwork数据框,然后查看修复数据框中有多少行满足条件。但是,由于两个DataFrame的大小(300,000次修复,到2007年1月1日为止),此选项不够快。 我当前的解决方案是(很抱歉隐藏代码,我只想要一个有效的解决方案:

for date in dates:
    temp = repairs.loc[(repairs['Date In'] < date) & (repairs['Date Out'] > date)][['Date In', 
    'Location']]
    temp['Date In'] = date
    temp = temp.reset_index()
    temp = temp.drop(columns=['index'])
    locdates = locdates.append(temp)
    temp = temp.iloc[0:0]

locdates['Date'] = locdates['Date In']
locdates['Date In'] = 1

locwork = locdates.groupby(['Date', 'Shop']).sum()
locwork = locwork.unstack()\
            .fillna(0)\
            .reset_index()\
            .droplevel(0, axis = 1)
locwork = locwork.set_index(locwork.columns[0])
print(locwork)

什么是更整洁,更Python化的方式来实现这一目标?

0 个答案:

没有答案