Python 如何将数据帧列拆分为多行?

Python 如何将数据帧列拆分为多行?,python,pandas,dataframe,Python,Pandas,Dataframe,我正在尝试将多列转换为多行。有人能给点建议吗 我有数据帧: id . values 1,2,3,4 [('a','b'), ('as','bd'),'|',('ss','dd'), ('ws','ee'),'|',('rr','rt'), ('tt','yy'),'|',('yu','uu'), ('ii','oo')] 我需要它看起来像这样: ID Values 1 ('a','b'), ('as','bd') 2 ('ss'

我正在尝试将多列转换为多行。有人能给点建议吗

我有数据帧:

id .        values
1,2,3,4     [('a','b'), ('as','bd'),'|',('ss','dd'), ('ws','ee'),'|',('rr','rt'), ('tt','yy'),'|',('yu','uu'), ('ii','oo')]
我需要它看起来像这样:

ID       Values
1         ('a','b'), ('as','bd')
2         ('ss','dd'), ('ws','ee')
3         ('rr','rt'), ('tt','yy')
4         ('yu','uu'), ('ii','oo')

我尝试了
groupby
split
izip
。也许我做得不对?

我做了一个快速而肮脏的示例,说明如何解析此数据帧

#示例数据帧
df=[
"1,2,3,4",
[(‘a’、‘b’)、(‘as’、‘bd’)、‘|’、(‘ss’、‘dd’)、(‘ws’、‘ee’、‘rr’、‘rt’、(‘tt’、‘yy’、‘uu’、‘ii’、‘oo’)]
]
#用逗号分割ID
ids=df[0]。拆分(“,”)
#init Id和项为int和dict()
Id=0
Items=dict()
#为数据插入准备数组
对于ID中的i:
项目[i]=[]
#插入数据
对于df[1]中的i:
如果是实例(i,(元组)):
项目[Id[Id]]。追加(i)
elif isinstance(i,(str)):
Id+=1
#打印stackoverflow问题中写入的数据
打印(“id.\t值”)
对于项目中的项目:
打印(“{}\t{}”。格式(项,项[项])

我提出了一个非常简洁的解决方案,基于多级分组, 在我看来,这在很大程度上是泛泛之谈

从定义以下函数开始,“拆分”一系列 从单个值元素到一系列列表表示, 没有周围的[和]。拆分发生在每个“|”元素处:

def fn(grp1):
    grp2 = (grp1 == '|').cumsum()
    return grp1[grp1 != '|'].groupby(grp2).apply(lambda x: repr(list(x))[1:-1])
(稍后将使用)

处理的第一步是将id列转换为序列:

对于您的数据,结果是:

0  0    1
   1    2
   2    3
   3    4
Name: ID, dtype: object
0  0      ('a', 'b'), ('as', 'bd')
   1    ('ss', 'dd'), ('ws', 'ee')
   2    ('rr', 'rt'), ('tt', 'yy')
   3    ('yu', 'uu'), ('ii', 'oo')
Name: Values, dtype: object
  ID                      Values
0  1    ('a', 'b'), ('as', 'bd')
1  2  ('ss', 'dd'), ('ws', 'ee')
2  3  ('rr', 'rt'), ('tt', 'yy')
3  4  ('yu', 'uu'), ('ii', 'oo')
多索引的第一级是源行的索引,第二级是源行的索引 级别是连续的数字(在当前行内)

现在是执行类似的值转换列的时候了:

结果是:

0  0    1
   1    2
   2    3
   3    4
Name: ID, dtype: object
0  0      ('a', 'b'), ('as', 'bd')
   1    ('ss', 'dd'), ('ws', 'ee')
   2    ('rr', 'rt'), ('tt', 'yy')
   3    ('yu', 'uu'), ('ii', 'oo')
Name: Values, dtype: object
  ID                      Values
0  1    ('a', 'b'), ('as', 'bd')
1  2  ('ss', 'dd'), ('ws', 'ee')
2  3  ('rr', 'rt'), ('tt', 'yy')
3  4  ('yu', 'uu'), ('ii', 'oo')
请注意,上面的多索引与sId的结构相同

最后一步是将这两部分结果结合起来:

result = pd.concat([sId, sVal], axis=1).reset_index(drop=True)
结果是:

0  0    1
   1    2
   2    3
   3    4
Name: ID, dtype: object
0  0      ('a', 'b'), ('as', 'bd')
   1    ('ss', 'dd'), ('ws', 'ee')
   2    ('rr', 'rt'), ('tt', 'yy')
   3    ('yu', 'uu'), ('ii', 'oo')
Name: Values, dtype: object
  ID                      Values
0  1    ('a', 'b'), ('as', 'bd')
1  2  ('ss', 'dd'), ('ws', 'ee')
2  3  ('rr', 'rt'), ('tt', 'yy')
3  4  ('yu', 'uu'), ('ii', 'oo')

请您添加用于创建该数据帧的代码,以便我们可以帮助您避免可能的重复?我现在将尝试此解决方案。