繁体   English   中英

使用条件在第二个熊猫 df 上为列分配值

[英]Assign values to a column using conditional on a second pandas df

我有一个带有日期和位置的 Pandas 数据框:

df1 = pd.DataFrame({'dates':['1-1-2013', '1-2-2013', 
      '1-3-2013'], 'locations':['L1','L2','L3']}) 

另一个 DataFrame 具有与每个位置相交的兴趣点计数:

df2 = pd.DataFrame({'dates':['1-1-2013', '1-2-2013', 
      '1-3-2013'], 'locations':['L1','L1','L1'], 'poi_cts':[23,12,23]}) 

df2 中的日期是 df1 日期的一小部分。

我想在 df1 (df1['counts']) 中创建一个列,该列对指定日期范围内(例如,在 df1 中的日期之前 14 天内)的 poi_cts 的每个位置/日期的 poi_cts 求和。

我试过了:

def ct_pts(window=14):

    Date = row.Date

    cts = np.sum(df2[(df2['Date'] < Date) & (df2['Date'] > (Date - np.timedelta64(window,'D')))]['poi_cts'])

return cts

df1.apply(ct_pts, axis = 1)

但这不起作用(不确定如何为每一行分配列,我在某处看到了这个示例,但它不起作用)。

我也可以按列来做这个,但我也在那里挣扎:

def ct_pts():
    new = pd.DataFrame()
    for location in pd.unique(df1['locations']):
        subset = df1[df1['locations']==location]
        for date in pd.unique(df1['Date']):
            df2 = df[df['Date'] == date]
            df2['spray'] = np.sum(df2[(df2['Date'] < Date) & (df2['Date'] > (Date - np.timedelta64(window,'D')))]['poi_cts'])
            new = new.append(df2)
    return new

这也不起作用。

我觉得我错过了一些非常简单的东西,有没有简单的方法来做到这一点?

我正在使用numpy boardcast来加快整个过程

l=[]
for x , y in df1.groupby('locations'):
    s=df2.loc[df2.locations==x,'dates'].values
    t=y['dates'].values
    v=((t[:,None]-s)/np.timedelta64(1, 'D'))
    l.extend(np.dot(((v>-14)&(v<=0)),df2.loc[df2.locations==x,'poi_cts'].values))



df1['cts']=l
df1
Out[167]: 
       dates locations  cts
0 2013-01-01        L1   23
1 2013-02-01        L2    0
2 2013-03-01        L3    0

这可能会慢一点,但您可以通过以下方式使用apply执行此操作:

  1. 创建一个新列来获取start_dates以便更容易过滤:

     df1['dates'] = pd.to_datetime(df1['dates']) df1['start_dates'] = df1['dates'] - pd.to_timedelta(14, unit='d')
  2. 在整个数据帧上应用函数:

     def ct_pts(row): df_fil = df2[(df2['dates'] <= row['dates']) & (df2['dates'] >= row['start_dates']) & (df2['locations'] == row['locations'])] row['counts'] = sum(df_fil['poi_cts']) return row df1 = df1.apply(ct_pts, axis=1)

输出:

dates       locations   start_dates counts
2013-01-01  L1          2012-12-18  23
2013-01-02  L2          2012-12-19  0
2013-01-03  L3          2012-12-20  0

我最初尝试使用 apply 工作:

def num_spray(row):

    Date = row['Date']

    cts = np.sum(df2[(df2['Date'] < Date) & (df2['Date'] > (Date - np.timedelta64(window,'D')))]['poi_cts'])

    return cts

df1.apply(ct_pts, axis = 1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM