2016-05-12 74 views
0

所以我有一个是结构如下方式大熊猫据帧条件:的Python:将字符串分割在其他列表元素

In: df.head(1) 
Out: 
Individual  Employer     EmployerState  BranchesState     BranchesNr 
872570   (4210, 7463, 23130, 133752) (MN, GA, NY, AZ) (MN, AZ, GA, AZ, NY, AZ, AZ) (0, 1, 0, 1, 0, 1, 0) 

现在我打算做的是分裂所有多个用人单位的信息,并创建一个每个雇主和雇员对单个记录,像这样:

Individual  Employer  EmployerState BranchesState  BranchesNr 
872570   4210   MN    MN, AZ    0, 1 
872570   7463   GA    GA, AZ    0, 1 
872570   23130   NY    NY, AZ    0, 1 
872570   133752   AZ    AZ     0 

目前,我能够通过将做到这一点对列个人,雇主和EmployerState下面的代码:

rows = [] # Store individuals in empty array 
for _, row in indv_sub.iterrows(): 

# If there are multiple employers 
# Example: 
# Individual | Employer  =>   Individual | Employer 
# 123  | (XY, AB)     123  | XY 
#          123  | AB 

    if len(str(row['Employer']).split(','))>1: 
     # split the individual record into as many employers as an individual has 
     [rows.append(
       [row['Individual'], 
        m.replace('(','').replace(')',''), 
        l.replace('(','').replace(')',''), 
        row['BranchesState']]) 
        for m,l in zip(row['Employer'].split(','),row['EmployerState'].split(','))] 
    else: 
     # just add the single employer 
     rows.append([row['Individual'], row['Employer'], row['EmployerState'], row['BranchesState']]) 

indv_relevant = pd.DataFrame(rows,columns=('Individual','Employer','EmployerState','BranchesState')) 
indv_relevant = indv_relevant.convert_objects(convert_numeric=True) 

这工作得很好,但我不能很好地拆分BranchesState列。我添加了一个BranchesNr字段,用于指示下一个雇主的分支。因此,考虑这个例子:

Employer   BranchesState     BranchesNr 
(MN, GA, NY, AZ) (MN, AZ, GA, AZ, NY, AZ, AZ) (0, 1, 0, 1, 0, 1, 0) 

的第一个值是0,1后面是0,这表明所有到第二位置的分支属于第一个雇主。

list(row['BranchesState'].split(','))[:2] # would be attributable to the first employer 

接下来是位置3到4,这归因于第二雇主等等。我不太清楚如何很好地实现它。任何想法或建议?

P.S:字段是字符串而不是元组/列表。另外0,1,0只是一个例子,一些序列是0,1,2,0,1,0,1,2,3,4等。

要包括的数据的更多的变化,这里是10个观察值的示例:

{u'BrnchOfLoc_FirmNr ':{1490:U'(0,0) ' 1498:U'(0, 0,0,1,0'), 1594:u'(0,0)', 1618:u'(0,0,0)', 1632:u'(0,0)', 1633:u '(0,0)', 1687:u'(0,0)', 1738:u'(0,0)', 1783:u'(0,0,1)', 1793:u '(0,0)'}, u'BrnchOfLoc_state':{1490:u'(CA,CA)', 1498:u'(CA,CA,CA,CA)', 1594:u' ,PA)', u'(FL,FL)', 1618:u'(CA,CA,CA)', 1632:u'(NY,NY)', 1633:u'(NH,NH)', 1687: 1738:u'(CA,CA)', 1783:u'(MS,MS,LA)', 1793:u'(NJ,NJ)'', u'CrntEmp_orgPK':{1490:u' (13572,144875)', 1498:u'(112059,137743)', 1594:u'(519,162200)', 1618:u'(23131,111532,113269)', 1632:u' (6627,118660)', 1633:u'(6413,131406)', 1687:u'(131587,142133)', 1738:u'(23131,105698)', 1783:u'(159778 ,160431)', 1793:u'(6413,128859)'},(CA,CA)',{'1490:u'(CA,CA)', 1498:u'(CA,CA)', 1594:u'(PA,PA)', 1618: CA,CA)', 1632:u'(NY,NY)', 1633:u'(MA,NH)', 1687:u'(FL,FL)', 1738:u' CA)', 1783:u'(MS,LA)', 1793:u'(MA,NJ)'', u'Info_indv1PK':{1490:u'731003', 1498:u'29443' , 1594:u'708024' , 1618:u'707057' , 1632:u'830502' , 1633:u'854101' , 1687:u'706344' , 1738:u'867229' , 1783:u'734227', 1793 :u'849856' }, 'NumberEmployer':{1490:2, 1498:2, 1594:2, 1618:3,1632 :2, 1633:2, 1687:2, 1738: 2, 1783:2, 1793:2}}

+0

您能否提供一个较小的示例,显示给定输入的准确输出?我并不十分清楚这些分支应该如何工作,而完整的样本会有所帮助。另外,将示例数据框的代码放在一起可以帮助人们回答。 – ASGM

+0

我使列名更易于解释并扩展了示例。这有帮助吗? – chizze

+0

'df.head()。to_dict('list')''?在数据中看到更多的变化是很好的。 – Alexander

回答

0

我觉得这让你快到了,但我仍然不分裂EmployerState规则明确。也许你可以包含一个额外的例子?

df = pd.DataFrame(
    {'BranchesNr': ['(0, 1, 0, 1, 0, 1, 0)', 
        '(0, 1, 0, 1, 0, 1, 0)'], 
    'BranchesState': ['(MN, AZ, GA, AZ, NY, AZ, AZ)', 
         '(MN, AZ, GA, AZ, NY, AZ, AZ)'], 
    'Employer': ['(4210, 7463, 23130, 133752)', 
        '(4210, 7463, 23130, 133752)'], 
    'EmployerState': ['(MN, GA, NY, AZ)', 
         '(MN, GA, NY, AZ)'], 
    'Individual': [872570, 872570]}) 

df['Employer'] = df.Employer.str.findall('(\d+)') 
df['EmployerState'] = df.EmployerState.str.findall('(\w+)') 
df['BranchesState'] = df.BranchesState.str.findall('(\w+)') 
df['BranchesNr'] = df.BranchesNr.str.findall('(0|1)+') 

indices = [[0] + [n for n, flag in enumerate(branches, 1) if flag == '1'] 
      for branches in df.BranchesNr] 

>>> [(row. Individual, row.Employer[n], row. EmployerState[n]) 
    for idx, row in df.iterrows() 
    for n in range(len(row.Employer))] 


[(872570, '4210', 'MN'), 
(872570, '7463', 'GA'), 
(872570, '23130', 'NY'), 
(872570, '133752', 'AZ'), 
(872570, '4210', 'MN'), 
(872570, '7463', 'GA'), 
(872570, '23130', 'NY'), 
(872570, '133752', 'AZ')] 
+0

是的,这是有效的,但BranchesStates应该在BranchesNr中的相应位置拆分,当元素为零时,除了前0以外。因此,对于我提到的示例,BranchesStates应该分成4个部分:[:2],[2 :4],[4:6],[6]。这是否更有意义?所以从第一个0到第二个0,从第二个零到第三个零,等等。 – chizze

+0

我相信'indices'变量表示分割何时发生,但我仍然不确定这个逻辑。你能否提供更多变化的例子? – Alexander

+0

假设有两个雇主A和B每个都有一个分支:A1和B1。因此,数据如下: '个人(A,B)(A1,B1)(0,0)' 但我不一定知道哪个分支属于哪个雇主,可能是A1和B1实际上属于A.所以(0,0)表示第一个分支属于第一个雇主,第二个分支属于第二个雇主。如果BranchNr的值是(0,1),那么现在我将两个分支都属于A.是否更清楚? – chizze