尝试实现pandas的privte_table,为每个参与方和每个州生成一个表,显示参与方从该州收到的总捐款。
这是正确的方法,或者它必须进入数据库并被取出。然而,下面的代码给出了错误。
party_and_state = candidates.merge(contributors, on='id')
party_and_state.pivot_table(df,index=["party","state"],values=["amount"],aggfunc=[np.sum])
预期结果可能如下表所示。第一行是州名D下面的D是每个州的总票数,R
也是如此+-----------------+---------+--------+
| state | D | R |
+-----------------+---------+--------+
| AK | 500 | 900 |
| IL | 600 | 877 |
| FL | 200 | 400 |
| UT | 300 | 300 |
| CA | 109 | 90 |
| MN | 800 | 888 |
考虑使用pd
作为限定符而不是数据框的一般化pandas合并,因为连接字段的命名不同,因此需要left_on和right_on参数。另外,如果运行pivot_table
作为数据帧的方法,不要传入df
,因为调用的df被传递到函数中。
使用contributor 和contributors_with_candidates文本文件。此外,根据您想要的结果,您可能希望使用pivot_table:
的values参数import numpy as np
import pandas as pd
contributors = pd.read_table('contributors_with_candidate_id.txt', sep="|")
candidates = pd.read_table('candidates.txt', sep="|")
party_and_state = pd.merge(contributors, candidates,
left_on=['candidate_id'], right_on=['id'])
party_and_state.pivot_table(index=["party", "state"],
values=["amount"], aggfunc=np.sum)
# amount
# party state
# D CA 1660.80
# DC 200.09
# FL 4250.00
# IL 200.00
# MA 195.00
# ...
# R AK 1210.00
# AR 14200.00
# AZ 120.00
# CA -6674.53
# CO -5823.00
party_and_state.pivot_table(index=["state"], columns=["party"],
values=["amount"], aggfunc=np.sum)
# amount
# party D R
# state
# AK NaN 1210.00
# AR NaN 14200.00
# AZ NaN 120.00
# CA 1660.80 -6674.53
# CO NaN -5823.00
# CT NaN 2300.00
请注意,您可以使用read_sql:
将合并作为SQL中的内部连接来执行。party_and_state = pd.read_sql("SELECT c.*, n.* FROM contributors c " +
"INNER JOIN candidates n ON c.candidate_id = n.id",
con = db)
party_and_state.pivot_table(index=["state"], columns=["party"],
values=["amount"], aggfunc=np.sum)