我有以下两个数据库:
url='https://raw.githubusercontent.com/108michael/ms_thesis/master/rgdp_catcode.merge'
df=pd.read_csv(url, index_col=0)
df.head(1)
naics catcode GeoName Description ComponentName year GDP state
0 22 E1600',\t'E1620',\t'A4000',\t'E5000',\t'E3000'... Alabama Utilities Real GDP by state 2004 5205 AL
url='https://raw.githubusercontent.com/108michael/ms_thesis/master/mpl.Bspons.merge'
df1=pd.read_csv(url, index_col=0)
df1.head(1)
state year unemployment log_diff_unemployment id.thomas party type date bills id.fec years_exp session name disposition catcode
0 AK 2006 6.6 -0.044452 1440 Republican sen 2006-05-01 s2686-109 S2AK00010 39 109 National Cable & Telecommunications Association support C4500
关于df,我必须手动输入
catcode
值。我认为这就是关闭格式的原因。我想要的是简单地使用没有\t
前缀的值。我想合并catcode, state, year
上的dfs。我之前进行了测试,其中每个单元格只有一个值的df1.catcode
与每个单元格具有多个值的另一个df.catcode
中的值匹配,并且可以正常工作。因此,从技术上讲,我要做的就是在
\t
中的每个连续值之前丢失df.catcode
,但是此外,如果有人以前曾经进行过此类合并,那么任何通过经验学习的“技巧”都会受到赞赏。我的合并代码如下所示:mplmerge=pd.merge(df1,df, on=(['catcode', 'state', 'year']), how='left' )
我认为这可以通过regex方法完成,我现在正在看文档。
最佳答案
清洁catcode
中的df
列非常简单:
catcode_fixed = df.catcode.str.findall('[A-Z][0-9]{4}')
这将产生一个系列,每行都有一个猫码列表:
catcode_fixed.head(3)
Out[195]:
0 [E1600, E1620, A4000, E5000, E3000, E1000]
1 [X3000, X3200, L1400, H6000, X5000]
2 [X3000, X3200, L1400, H6000, X5000]
Name: catcode, dtype: object
如果我正确理解您想要的内容,则需要对这些列表进行“取消组合”。简而言之,Here是诀窍:
catcode_fixed = catcode_fixed = catcode_fixed.apply(pd.Series).stack()
catcode_fixed.index = catcode_fixed.index.droplevel(-1)
因此,我们得到了(请注意索引值):
catcode_fixed.head(12)
Out[206]:
0 E1600
0 E1620
0 A4000
0 E5000
0 E3000
0 E1000
1 X3000
1 X3200
1 L1400
1 H6000
1 X5000
2 X3000
dtype: object
现在,删除旧的
catcode
并加入新的df1.reset_index()
:df.drop('catcode',axis = 1, inplace = True)
catcode_fixed.name = 'catcode'
df = df.join(catcode_fixed)
顺便说一句,合并数据帧时可能还需要使用。