Панды сворачивают несколько столбцов, начиная с символа, в строку / столбцы - PullRequest
1 голос
/ 17 октября 2019

Я недавно сплющил глубоко вложенный список словаря во фрейм данных: [{},{{}},..,{}]. У меня более 1500+ столбцов, я пытаюсь найти умный способ, чтобы разобрать их в строки и столбцы чистым способом. Вот мой пример (проще), мои реальные данные сложнее. Я просто хотел начать, чтобы увидеть, есть ли решение для этого. Я не могу решить только эти два столбца.

Имена столбцов начинаются с 1x, 2x, ... 1500 + x. У меня только 1 ряд. Вот мой DataFrame:

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 строка) из-за выравнивания. Очень ценю помощь!

Ответы [ 3 ]

2 голосов
/ 17 октября 2019

Первый принцип - создать MultiIndex в столбцах с помощью Series.str.split с expand=True, а затем изменить его на DataFrame.unstack, последний установить значения индекса по умолчанию на DataFrame.reset_index с drop=True:

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

Или используйте wide_to_long с переименованием для чисел после _:

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
1 голос
/ 17 октября 2019

Вот один из способов 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
0 голосов
/ 17 октября 2019

Я полагаю, что вам нужно только reshape, если числа FileName и Year равны:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...