У меня есть проблема, которую я никак не могу решить. То ли это потому, что я неправильно понимаю списки и массивы, не знаю. У меня есть датафрейм, состоящий из данных в такой форме:

  index                              artists      Title language  \
0      0                      Carl Woitschach    ['de', 'german']   
1      1    Robert Schumann,Vladimir Horowitz   ['it', 'italian']   
2      2                  Seweryn Goszczyński    ['pl', 'polish']   
3      3                     Francisco Canaro  ['gl', 'galician']   
4      4    Frédéric Chopin,Vladimir Horowitz    ['fr', 'french']   
5      5  Felix Mendelssohn,Vladimir Horowitz   ['it', 'italian']   
6      6        Franz Liszt,Vladimir Horowitz    ['fr', 'french']   
7      7                      Carl Woitschach   ['it', 'italian']   
8      8              Francisco Canaro,Charlo   ['es', 'spanish']   
9      9                  Seweryn Goszczyński    ['pl', 'polish']   

  Artist name language  
0     ['de', 'german']  
1    ['en', 'english']  
2     ['pl', 'polish']  
3    ['es', 'spanish']  
4    ['en', 'english']  
5    ['en', 'english']  
6    ['en', 'english']  
7     ['de', 'german']  
8    ['es', 'spanish']  
9     ['pl', 'polish']  

где

df['Artist name language'].unique()


array(["['de', 'german']", "['en', 'english']", "['pl', 'polish']",
       "['es', 'spanish']", "['lb', 'luxembourgish']",
       "['tr', 'turkish']", "['co', 'corsican']", "['ja', 'japanese']",
       "['ar', 'arabic']", "['el', 'greek']", "['id', 'indonesian']",
       "['ht', 'haitian creole']", "['eo', 'esperanto']",
       "['fr', 'french']", "['pt', 'portuguese']", "['it', 'italian']",
       "['hu', 'hungarian']", "['sq', 'albanian']", "['mg', 'malagasy']",
       "['nl', 'dutch']", "['zh-CN', 'chinese (simplified)']",
       "['af', 'afrikaans']", "['mn', 'mongolian']", "['ro', 'romanian']",
       "['bn', 'bengali']", "['hi', 'hindi']", "['mr', 'marathi']",
       "['mi', 'maori']", "['cs', 'czech']", "['ga', 'irish']",
       "['hr', 'croatian']", "['ms', 'malay']", "['sv', 'swedish']",
       "['bg', 'bulgarian']", "['da', 'danish']", "['xh', 'xhosa']",
       "['gu', 'gujarati']", "['ml', 'malayalam']", "['ru', 'russian']",
       "['cy', 'welsh']", "['kn', 'kannada']", "['fy', 'frisian']",
       "['jw', 'javanese']", "['te', 'telugu']", "['su', 'sundanese']",
       "['ta', 'tamil']", "['fi', 'finnish']", "['ha', 'hausa']",
       "['sk', 'slovak']", "['ig', 'igbo']", "['is', 'icelandic']",
       "['sn', 'shona']", "['ca', 'catalan']", "['ny', 'chichewa']",
       "['no', 'norwegian']", "['gl', 'galician']", "['la', 'latin']",
       "['et', 'estonian']", "['tl', 'filipino']", "['haw', 'hawaiian']",
       "['eu', 'basque']", "['zu', 'zulu']", "['sl', 'slovenian']",
       "['vi', 'vietnamese']", "['gd', 'scots gaelic']",
       "['yo', 'yoruba']", "['hmn', 'hmong']", "['mt', 'maltese']",
       "['lt', 'lithuanian']", "['ku', 'kurdish (kurmanji)']",
       "['bs', 'bosnian']", "['sm', 'samoan']", "['tk', 'turkmen']",
       "['ceb', 'cebuano']", "['so', 'somali']", "['uz', 'uzbek']",
       "['az', 'azerbaijani']", "['sw', 'swahili']", "['st', 'sesotho']",
       "['lv', 'latvian']", "['uk', 'ukrainian']", "['th', 'thai']"],
      dtype=object)

Как вы можете видеть, все списки имеют одинаковую длину. Теперь я хочу разделить столбцы Язык имени исполнителя и Язык названия на четыре столбца, два из которых содержат краткие названия языков из каждого списка, а два последних - полные названия языков.

Так, как я узнал до того, как сделал это:

df[['Artist name language ISO','Artist name language FULL']] = pd.DataFrame(df['Artist name language'].tolist(), index= df.index)

но он потерпел неудачу с этой ошибкой

ValueError: Columns must be same length as key

Но это не имеет никакого смысла, поскольку, как я писал выше, нет ни nan значений, ни каких-либо списков, которые не имеют формата ['a','b']. Единственное, что действительно немного отличается, это ['zh-CN', 'chinese (simplified)'], но я не могу поверить, что это может быть причиной.

Я даже пытался:

df1=pd.DataFrame(list(df['Artist Name language']),columns=['Artist Name language ISO','Artist Name language FULL'])

pd.concat([df,df1],axis=1)

но получил ошибку:

ValueError: Shape of passed values is (169886, 1), indices imply (169886, 2)

Может быть, я что-то неправильно понял в этом методе? Любая помощь в этом вопросе будет принята с благодарностью.

Ответы (2)

Сначала нужно оценить строки в колонках Artist Name language и Title language как списки python, это можно сделать с помощью literal_eval из модуля ast, затем можно назначить новые колонки в dataframe:

from ast import literal_eval

c = ['Artist name language ISO','Artist name language FULL']
df[c] = df['Artist name language'].map(literal_eval).tolist()

print(df[c])

  Artist name language ISO Artist name language FULL
0                       de                    german
1                       en                   english
2                       pl                    polish
3                       es                   spanish
4                       en                   english
5                       en                   english
6                       en                   english
7                       de                    german
8                       es                   spanish
9                       pl                    polish

попробуйте это:

df1=pd.DataFrame(list(df['Title language']),columns=['Title ISO','Title language Full'])

df2=pd.DataFrame(list(df['Artist Name language']),columns=['Artist Name language ISO','Artist Name language FULL'])



pd.concat([df,df1,df2],axis=1)

2022 WebDevInsider