如果满足三个标准,Pandas列就是总和(类似于sumproduct)

时间:2018-03-29 19:33:04

标签: python pandas dataframe data-analysis

我正在尝试创建一个新列,其值是另一列的总和,但前提是两列包含特定值。

origin_data_frame(df_o)

month   state       count
2015-12 Alabama     31359
2015-12 Alaska      245
2015-12 Arizona     2940
2015-12 Arkansas    4076
2015-12 California  119166
2015-12 Colorado    3265
2015-12 Connecticut 12190
2015-12 Delaware    297
2015-12 DC          16
....... ...         ..

target_data_frame(df_t)('计数'不存在):

   level_0          level_1        Veterans, 2011-2015  counts
0  h_pct_vet        California     1777410              <?>
1  h_pct_vet        Texas          1539655              <?>  
2  h_pct_vet        Florida        1507738              <?>
3  h_pct_vet        Pennsylvania   870770               <?> 
4  h_pct_vet        New York       828586               <?>
5  l_pct_vet        Vermont        44708                <?>
6  l_pct_vet        Wyoming        48505                <?>

问题:

如果月份介于“2011-01”和“2015-12”之间且状态等于“level_1”,则

计数应包含一个值,即计数总和。

我可以在时间范围内获得所有计数的总和:

counts_2011_2015 = df_o['count'][(df_o['month'] >= '2011-01-01') & (df_o['month'] <= '2015-12-31')].sum()

到目前为止我尝试了但没有成功:

df_t['counts'] = df_o['count'][(df_o['month'] >= '2011-01-01') & (df_o['month'] <= '2015-12-31') & (df_o['state'] == df_t['level_1'])].sum()

它引发了一个ValueError:“ValueError:只能比较标记相同的Series对象”。

我到目前为止所发现的(丢失索引)没有用,所以如果有人有想法,我会感激不尽

2 个答案:

答案 0 :(得分:0)

首先尝试按状态对它们进行分组,然后将它们与df_t合并:

# untested code
counts = (
    df_o[df_o.month.between("2011-01", "2015-12")]
    .groupby("state")["count"].sum()
    .reset_index(name="counts")
)

df_t.merge(counts, left_on="level_1", right_index=True, how="left")

答案 1 :(得分:0)

如果您希望避免显式合并,@pomber's solution的替代方法是对齐索引,从groupby指定一个系列,然后重置索引。

df_t = df_t.set_index('level_1')

df_t['counts'] = df_o.loc[df_o.month.between('2011-01', '2015-12')]\
                     .groupby('state')['count'].sum()

df_t = df_t.reset_index()