【问题标题】:pandas: Split dataframe columns into separate rows [duplicate]熊猫:将数据框列拆分为单独的行[重复]
【发布时间】:2018-11-12 11:41:11
【问题描述】:

基于此SO question,我想根据列var1 拆分我的数据框。但是,字母之间没有分隔符。

import pandas as pd
a = pd.DataFrame([{'var1': 'abc', 'var2': 1},
                  {'var1': 'def', 'var2': 2}])
b = pd.DataFrame([{'var1': 'a', 'var2': 1},
                  {'var1': 'b', 'var2': 1},
                  {'var1': 'c', 'var2': 1},
                  {'var1': 'd', 'var2': 2},
                  {'var1': 'e', 'var2': 2},
                  {'var1': 'f', 'var2': 2}])

这就是我想要达到的目标。

>>> a
  var1  var2
0  abc     1
1  def     2
>>> b
  var1  var2
0    a     1
1    b     1
2    c     1
3    d     2
4    e     2
5    f     2

.split() 不适用于空字符 ("")。

pd.concat([Series(row['var2'], row['var1'].split(','))              
                  for _, row in a.iterrows()]).reset_index()

因此,上述方法不起作用。知道如何实现吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果性能很重要,请使用列表推导:

    df = pd.DataFrame([[x, j] for i, j in zip(a['var1'], a['var2']) for x in list(i)], 
                       columns=a.columns)
    print (df)
      var1  var2
    0    a     1
    1    b     1
    2    c     1
    3    d     2
    4    e     2
    5    f     2
    

    小型 DataFrame 中的性能:

    In [215]: %timeit pd.DataFrame([[x, j] for i, j in zip(a['var1'], a['var2']) for x in list(i)], columns=a.columns)
    355 µs ± 4.08 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    In [216]: %timeit pd.concat([pd.Series(row['var2'], list(row['var1'])) for _, row in a.iterrows()]).reset_index()
    2.93 ms ± 203 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    #2k rows
    a = pd.concat([a] * 1000, ignore_index=True)
    
    In [217]: %timeit pd.DataFrame([[x, j] for i, j in zip(a['var1'], a['var2']) for x in list(i)], columns=a.columns)
    2.82 ms ± 23.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    In [218]: %timeit pd.concat([pd.Series(row['var2'], list(row['var1'])) for _, row in a.iterrows()]).reset_index()
    1.8 s ± 140 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    

    编辑:

    多列的通用解决方案:

    a = pd.DataFrame([{'var1': 'abc', 'var2': 1, 'var3':7},
                      {'var1': 'def', 'var2': 2, 'var3':5}])
    
    
    b = pd.DataFrame([(y, *x[1:]) for x in a.values.tolist() for y in list(x[0])], 
                      columns=a.columns)
    print (b)
      var1  var2  var3
    0    a     1     7
    1    b     1     7
    2    c     1     7
    3    d     2     5
    4    e     2     5
    5    f     2     5
    

    #lower python versions
    b = pd.DataFrame([(y,) + tuple(x[1:]) for x in a.values.tolist() for y in list(x[0])], 
                      columns=a.columns)
    print (b)
      var1  var2  var3
    0    a     1     7
    1    b     1     7
    2    c     1     7
    3    d     2     5
    4    e     2     5
    5    f     2     5
    

    【讨论】:

    • 太好了,谢谢。如果我的数据框有两列以上(例如var1var2var3var4),我将如何调整您的命令?
    • @littlebird - 给我一秒钟
    • @littlebird 这是重复的,请参阅stackoverflow.com/a/48197395/4909087 以获得您刚刚提出的问题的确切答案
    • @littlebird - 检查编辑的答案
    【解决方案2】:

    使字符串成为一个列表:

    pd.concat([pd.Series(row['var2'], list(row['var1'])) for _, row in a.iterrows()]).reset_index()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-28
      • 2018-07-26
      • 2020-03-21
      • 2020-05-08
      • 2019-11-05
      • 2018-12-04
      • 1970-01-01
      • 2018-10-09
      相关资源
      最近更新 更多