【问题标题】:Pandas split a column in data-frame and get headersPandas 在数据框中拆分一列并获取标题
【发布时间】:2017-03-01 04:01:37
【问题描述】:

我有一个带有“A”列的熊猫数据框

dfc = pd.DataFrame( {"A": ['AB=0.246154;ABP=39.3908;AC=3', 'AB=0.3;ABP=9.95901;AC=2;AF=0.333333', 'AB=0;ABP=0;AC=6;AF=1;AN=6;AO=86', 'AB=0.461538;ABP=3.51141;AC=2']})

我想拆分数据框中的“A”列并获得新的数据框,例如,

    A   AB  ABP AC  AF  AN  AO 
0   AB=0.246154;ABP=39.3908;AC=3    0.246154    39.3908 3   None    None    None
1   AB=0.3;ABP=9.95901;AC=2;AF=0.333333 0.3 9.95901 2   0.333333    None    None
2   AB=0;ABP=0;AC=6;AF=1;AN=6;AO=86 0   0   6   1   6   86
3   AB=0.461538;ABP=3.51141;AC=2    0.461538    3.51141 2   None    None    None

我尝试使用分割数据框列,

dfc.A.str.split(';', expand = True)

但它提供了新的数据框,例如,

             0            1     2            3     4      5
0  AB=0.246154  ABP=39.3908  AC=3         None  None   None
1       AB=0.3  ABP=9.95901  AC=2  AF=0.333333  None   None
2         AB=0        ABP=0  AC=6         AF=1  AN=6  AO=86
3  AB=0.461538  ABP=3.51141  AC=2         None  None   None

如何使用列中“=”之前的文本将标题添加到列并将这个新数据框添加到原始数据框? 有没有pythonic的方法可以在一行中完成这两个操作?

谢谢

【问题讨论】:

    标签: python pandas dataframe split


    【解决方案1】:

    尝试以下,正确拆分字符串后为A列中的每个元素构造一个系列/字典,索引/键将成为结果中的标题(使用pd.concat将原始A列与新数据连接起来框架(如果需要):

    dfc.A.apply(lambda x: pd.Series(dict(s.split("=") for s in x.split(";"))))
    
    #         AB       ABP  AC        AF     AN  AO
    #0  0.246154   39.3908   3       NaN    NaN NaN
    #1       0.3   9.95901   2  0.333333    NaN NaN
    #2         0         0   6         1      6  86
    #3  0.461538   3.51141   2       NaN    NaN NaN
    

    【讨论】:

      【解决方案2】:

      使用extractall

      e = dfc.A.str.extractall('([^;]+)=([^;]+)')
      pd.Series(e.values[:, 1], [e.index.get_level_values(0), e.values[:, 0]]).unstack()
      
               AB      ABP AC        AF    AN    AO
      0  0.246154  39.3908  3      None  None  None
      1       0.3  9.95901  2  0.333333  None  None
      2         0        0  6         1     6    86
      3  0.461538  3.51141  2      None  None  None
      

      【讨论】:

        【解决方案3】:

        这应该可行:

        d = {"A": ['AB=0.246154;ABP=39.3908;AC=3', 'AB=0.3;ABP=9.95901;AC=2;AF=0.333333', 'AB=0;ABP=0;AC=6;AF=1;AN=6;AO=86', 'AB=0.461538;ABP=3.51141;AC=2']}
        rows = [s.split(";") for s in d["A"]]
        data = [dict(cell.split('=') for cell in row) for row in rows]
        
        df = pd.DataFrame(data)
        print (df)
        

        d = {"A": ['AB=0.246154;ABP=39.3908;AC=3', 'AB=0.3;ABP=9.95901;AC=2;AF=0.333333', 'AB=0;ABP=0;AC=6;AF=1;AN=6;AO=86', 'AB=0.461538;ABP=3.51141;AC=2']}
        dfc = pd.DataFrame(d)
        
        f = lambda s : dict(cell.split('=') for cell in s.split(';'))
        df = pd.DataFrame(dfc.A.apply(f).tolist())
        print (df)
        

        输出:

                 AB      ABP AC        AF   AN   AO
        0  0.246154  39.3908  3       NaN  NaN  NaN
        1       0.3  9.95901  2  0.333333  NaN  NaN
        2         0        0  6         1    6   86
        3  0.461538  3.51141  2       NaN  NaN  NaN
        

        【讨论】:

          【解决方案4】:
          def spliter(data):
              pairs = [x.split("=") for x in data.split(";")]
              return pd.Series({key: val for key, val in pairs})
          
          
          dfc.A.apply(spliter)
          
          
                   AB      ABP AC        AF   AN   AO
          0  0.246154  39.3908  3       NaN  NaN  NaN
          1       0.3  9.95901  2  0.333333  NaN  NaN
          2         0        0  6         1    6   86
          3  0.461538  3.51141  2       NaN  NaN  NaN
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-08-17
            • 2020-10-27
            • 2021-04-27
            • 2020-10-01
            • 2023-03-14
            • 1970-01-01
            • 1970-01-01
            • 2014-02-28
            相关资源
            最近更新 更多