猿问

拆分(爆炸)熊猫数据串条目以分隔行

拆分(爆炸)熊猫数据串条目以分隔行

我有一个pandas dataframe其中一列文本字符串包含逗号分隔的值。我希望拆分每个CSV字段,并在每个条目中创建一个新行(假设CSV是干净的,只需要在‘,’上拆分)。例如,a应该变成b:

In [7]: aOut[7]: 
    var1  var20  a,b,c     11  d,e,f     2In [8]: bOut[8]: 
  var1  var20    a     11    b     12    c     13    d     24    e     25    f     2

到目前为止,我已经尝试过各种简单的函数,但是.apply方法在轴上使用时,似乎只接受一行作为返回值,而我无法获得.transform去工作。任何建议都将不胜感激!

示例数据:

from pandas import DataFrameimport numpy as np
a = DataFrame([{'var1': 'a,b,c', 'var2': 1},
               {'var1': 'd,e,f', 'var2': 2}])b = 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}])

我知道这是行不通的,因为我们通过numpy丢失了DataFrame元数据,但是它应该让您了解我试图做的事情:

def fun(row):
    letters = row['var1']
    letters = letters.split(',')
    out = np.array([row] * len(letters))
    out['var1'] = letters
a['idx'] = range(a.shape[0])z = a.groupby('idx')z.transform(fun)


慕哥6287543
浏览 490回答 3
3回答

慕田峪4524236

像这样的事怎么样:In [55]: pd.concat([Series(row['var2'], row['var1'].split(','))                                  for _, row in a.iterrows()]).reset_index()Out[55]:   index  00     a  11     b  12     c  13     d  24     e  25     f  2然后您只需重命名列

慕容708150

经过痛苦的实验,我发现了一些比公认的答案更快的东西,我让它起作用了。在我试用的数据集中,它的运行速度快了大约100倍。如果有人知道如何使这更优雅,请务必修改我的代码。如果不将其他列设置为索引,然后重新设置索引并重新命名列,我就无法找到工作方式,但我可以想象还有其他的工作方式。b = DataFrame(a.var1.str.split(',').tolist(), index=a.var2).stack()b = b.reset_index()[[0, 'var2']] # var1 variable is currently labeled 0b.columns = ['var1', 'var2'] # renaming var1
随时随地看视频慕课网APP

相关分类

Python
我要回答