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