Python 如何连接两个数据帧并使用Pandas创建一个计算相应值的表?
我的表1如下所示:Python 如何连接两个数据帧并使用Pandas创建一个计算相应值的表?,python,pandas,dataframe,join,count,Python,Pandas,Dataframe,Join,Count,我的表1如下所示: State District ID Race Party 0 GA 1 White Dem 1 SC 5 Black Dem 2 VA 4 Black Ind 3 VA 4 White Repub 4 NY 2 White
State District ID Race Party
0 GA 1 White Dem
1 SC 5 Black Dem
2 VA 4 Black Ind
3 VA 4 White Repub
4 NY 2 White Dem
5 GA 1 Black Dem
State District ID Event Type
0 GA 1 A; B; C
1 SC 5 B; A
2 VA 4 A; C
3 NY 2 B
4 GA 1 A; C
State District ID # Event A # Event B # Event C # White # Black # Dem # Repub # Ind
0 GA 1 2 1 2 1 1 2 0 0
1 SC 5 1 1 0 1 1 0 0
2 VA 4 1 0 1 1 1 0 1 1
3 NY 2 0 1 0 1 0 1 0 0
然后是表2,如下所示:
State District ID Race Party
0 GA 1 White Dem
1 SC 5 Black Dem
2 VA 4 Black Ind
3 VA 4 White Repub
4 NY 2 White Dem
5 GA 1 Black Dem
State District ID Event Type
0 GA 1 A; B; C
1 SC 5 B; A
2 VA 4 A; C
3 NY 2 B
4 GA 1 A; C
State District ID # Event A # Event B # Event C # White # Black # Dem # Repub # Ind
0 GA 1 2 1 2 1 1 2 0 0
1 SC 5 1 1 0 1 1 0 0
2 VA 4 1 0 1 1 1 0 1 1
3 NY 2 0 1 0 1 0 1 0 0
我希望生成的数据集如下所示:
State District ID Race Party
0 GA 1 White Dem
1 SC 5 Black Dem
2 VA 4 Black Ind
3 VA 4 White Repub
4 NY 2 White Dem
5 GA 1 Black Dem
State District ID Event Type
0 GA 1 A; B; C
1 SC 5 B; A
2 VA 4 A; C
3 NY 2 B
4 GA 1 A; C
State District ID # Event A # Event B # Event C # White # Black # Dem # Repub # Ind
0 GA 1 2 1 2 1 1 2 0 0
1 SC 5 1 1 0 1 1 0 0
2 VA 4 1 0 1 1 1 0 1 1
3 NY 2 0 1 0 1 0 1 0 0
当涉及到连接和创建计算相应行的结果表时,我非常不确定,而且我也从来没有使用Pandas来完成这项工作,所以我不太确定如何从这个开始。哪一张桌子会被认为是左桌子还是右桌子?这可能是一个非常常见的用例,我只是不知道代码行(或者如果我使用Postgres的话,SQL查询)是什么样子。注意:我删除了列名中的空格,使之更容易
from io import StringIO
import pandas as pd
df1 = pd.read_csv(StringIO(
"""
State District_ID Race Party
0 GA 1 White Dem
1 SC 5 Black Dem
2 VA 4 Black Ind
3 VA 4 White Repub
4 NY 2 White Dem
5 GA 1 Black Dem
"""), delim_whitespace=True)
df2 = pd.read_csv(StringIO(
"""
State District_ID Event_Type
0 GA 1 A
1 SC 5 B
2 VA 4 A
3 NY 2 B
4 GA 1 A
"""), delim_whitespace=True)
然后,我们创建三个数据透视表,分别对应于比赛、聚会、事件类型:
dfa = df1.assign(count = 1).pivot_table(index = ['State','District_ID'], columns = ['Race'], values='count' ,fill_value=0, aggfunc = 'sum')
dfb = df1.assign(count = 1).pivot_table(index = ['State','District_ID'], columns = ['Party'], values='count' ,fill_value=0, aggfunc = 'sum')
dfc = df2.assign(count = 1).pivot_table(index = ['State','District_ID'], columns = ['Event_Type'], values='count' ,fill_value=0, aggfunc = 'sum')
最后我们把他们连在一起
dfa.join(dfb).join(dfc)
输出
Black White Dem Ind Repub A B
State District_ID
GA 1 1 1 2 0 0 2 0
NY 2 0 1 1 0 0 0 1
SC 5 1 0 1 0 0 0 1
VA 4 1 1 0 1 1 1 0
State District ID Event Type
-- ------- ------------- ------------
0 GA 1 A
0 GA 1 B
0 GA 1 C
1 SC 5 B
1 SC 5 A
2 VA 4 A
2 VA 4 C
3 NY 2 B
4 GA 1 A
4 GA 1 C
OP更改为df2后编辑
如果第二个数据帧具有以“;”分隔的列表在事件类型
中,可以使用拆分
和分解
将其转换为原始形式:
df2 = pd.read_csv(StringIO(
"""
State District ID Event Type
0 GA 1 A; B; C
1 SC 5 B; A
2 VA 4 A; C
3 NY 2 B
4 GA 1 A; C
"""), sep='\s\s+')
df2['Event Type'] = df2['Event Type'].str.split(';')
df2.explode('Event Type')
输出
Black White Dem Ind Repub A B
State District_ID
GA 1 1 1 2 0 0 2 0
NY 2 0 1 1 0 0 0 1
SC 5 1 0 1 0 0 0 1
VA 4 1 1 0 1 1 1 0
State District ID Event Type
-- ------- ------------- ------------
0 GA 1 A
0 GA 1 B
0 GA 1 C
1 SC 5 B
1 SC 5 A
2 VA 4 A
2 VA 4 C
3 NY 2 B
4 GA 1 A
4 GA 1 C
发布你的数据样本,而不是描述你的数据所包含的内容。你想实现什么目标还不是很清楚。看一看。嘿,伙计们,对此很抱歉-我更新了OP以反映一些示例数据。嘿,这样做很有效(尽管我还需要在join语句中提供后缀)。但是,如果第二个表中的事件类型列是一个分号分隔的列表,您知道我应该怎么做吗?@archingfork请查看我的编辑。在将来,如果你改变了问题,使原来形式的问题的答案不再有意义,你应该这样标记,这样将来的读者就不会感到困惑了。谢谢提醒