我正在尝试创建一个新列,其值是另一列的总和,但前提是两列包含特定值。
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对象”。
我到目前为止所发现的(丢失索引)没有用,所以如果有人有想法,我会感激不尽
答案 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()