Python 3.x 将以字符开头的多列折叠为行/列
我最近将深度嵌套的字典列表展平到一个数据框中:Python 3.x 将以字符开头的多列折叠为行/列,python-3.x,pandas,Python 3.x,Pandas,我最近将深度嵌套的字典列表展平到一个数据框中:[{},{{}},…,{}]。我有超过1500多列,我正试图找到一种聪明的方法,以一种干净的方式将这些列折叠成行和列。这是我的示例(更简单),我的真实数据更难。我只是想开始看看是否有解决办法。我无法仅解这两列 列名以1x、2x、…1500+x开头。 我只有一排。 这是我的数据框: 0_FileName 1_FileName 2_FileName 3_FileName 0_Year 1_Year 2_Year 3_Year abc.pdf
[{},{{}},…,{}]
。我有超过1500多列,我正试图找到一种聪明的方法,以一种干净的方式将这些列折叠成行和列。这是我的示例(更简单),我的真实数据更难。我只是想开始看看是否有解决办法。我无法仅解这两列
列名以1x、2x、…1500+x开头。
我只有一排。
这是我的数据框:
0_FileName 1_FileName 2_FileName 3_FileName 0_Year 1_Year 2_Year 3_Year
abc.pdf def.txt abc.ppt def.pdf 2016 2016 2017 2018
我试图得到这样一个输出:可能吗
FileName,Year
abc.pdf,2016
def.txt,2016
abc.ppt,2017
def.pdf,2018
我的尝试:
df.T # just does the transpose. thoughts of grouping it?
df['FileName'] = df['0_FileName'] + ',' + df['1_FileName'] .... # problem with this is that I have do this many many times. Then split it by ',', and explode it through pandas functionality.
熊猫是否具有解决这些问题的功能?由于扁平化,我的数据框的形状是(1500多列,1行)。非常感谢你的帮助 这里有一种方法
melt
s=df.melt()
s.join(s.variable.str.split('_',expand=True)).pivot(0,1,values='value')
1 FileName Year
0
0 abc.pdf 2016
1 def.txt 2016
2 abc.ppt 2017
3 def.pdf 2018
这里有一种方法
melt
s=df.melt()
s.join(s.variable.str.split('_',expand=True)).pivot(0,1,values='value')
1 FileName Year
0
0 abc.pdf 2016
1 def.txt 2016
2 abc.ppt 2017
3 def.pdf 2018
第一个ide是在列中创建
多索引
,通过扩展=真
,然后通过重塑,最后设置默认索引值通过拖放=真
:
df.columns = df.columns.str.split('_', expand=True)
df = df.stack(0).reset_index(drop=True)
print (df)
FileName Year
0 abc.pdf 2016
1 def.txt 2016
2 abc.ppt 2017
3 def.pdf 2018
或与重命名一起用于之后的数字:
df = (pd.wide_to_long(df.rename(columns=lambda x: '_'.join(x.split('_')[::-1])).reset_index(),
['FileName','Year'],
i='index',
j='value',
sep='_').reset_index(drop=True))
print (df)
FileName Year
0 abc.pdf 2016
1 def.txt 2016
2 abc.ppt 2017
3 def.pdf 2018
第一个ide是在列中创建多索引
,通过扩展=真
,然后通过重塑,最后设置默认索引值通过拖放=真
:
df.columns = df.columns.str.split('_', expand=True)
df = df.stack(0).reset_index(drop=True)
print (df)
FileName Year
0 abc.pdf 2016
1 def.txt 2016
2 abc.ppt 2017
3 def.pdf 2018
或与重命名一起用于之后的数字:
df = (pd.wide_to_long(df.rename(columns=lambda x: '_'.join(x.split('_')[::-1])).reset_index(),
['FileName','Year'],
i='index',
j='value',
sep='_').reset_index(drop=True))
print (df)
FileName Year
0 abc.pdf 2016
1 def.txt 2016
2 abc.ppt 2017
3 def.pdf 2018
如果文件名
和年份
的数量相等,我相信您只需要重塑
:
pd.DataFrame(df.values.reshape(2,-1).transpose(), columns=['FileName','Year'])
输出:
FileName Year
0 abc.pdf 2016
1 def.txt 2016
2 abc.ppt 2017
3 def.pdf 2018
如果文件名
和年份
的数量相等,我相信您只需要重塑
:
pd.DataFrame(df.values.reshape(2,-1).transpose(), columns=['FileName','Year'])
输出:
FileName Year
0 abc.pdf 2016
1 def.txt 2016
2 abc.ppt 2017
3 def.pdf 2018
列是否遵循逻辑模式?与fileName
和Year
中一样,列是否遵循逻辑模式?如文件名
和年份
?非常感谢!这对我来说是一个很好的开始。我有很多复杂的扁平结构,我将尝试使用类似的技术从您的解决方案…让我们看看如何进行。非常感谢!这对我来说是一个很好的开始。我有很多复杂的扁平结构,我将尝试使用类似的技术从您的解决方案…让我们看看如何进行。