Есть ли способ разделить столбец, содержащий несколько наборов данных?

#pandas #dataframe

Вопрос:

Я новичок в этом, и фрейм данных, с которым я сейчас работаю, содержит четыре столбца, содержащие данные только в типе данных объекта. Последний столбец содержит несколько точек данных…

т. е. первая строка, последний столбец содержит:

 [{"year":"1901","a":"A","b":"B"}]   #printed in this format
 

Есть ли способ, чтобы я мог создать новый столбец, содержащий только год? т. Е. изолировать эти данные

Заранее спасибо

Ответ №1:

С помощью pandas вы можете добавить новый столбец так же, как вы добавляете значение в словарь. Так что это должно сработать для вас.

 df['year'] = [i[0]['year'] for i in df['last_column']]
 

Комментарии:

1. Спасибо! Я только что попробовал это, и он вернул ошибку — «индексы списка должны быть целыми числами или срезами, а не str». есть идеи, как обойти это

2. Я отредактировал ответ, и это должно сработать для вас. Я думаю, что, основываясь на информации в вашем вопросе, элемент i в понимании списка-это сам список, поэтому необходимо ссылаться на позицию индекса ( [0] ).

3. вы можете сделать это проще, используя df.apply. вам не нужно писать список понимания

Ответ №2:

Вы можете использовать df.apply (), чтобы получить значение словаря и назначить его новому столбцу.

 import pandas as pd
df = pd.DataFrame({'col1':['Jack','Jill','Moon','Wall','Hill'],
                   'col2':[100,200,300,400,500],
                   'col3':[{"year":"1901","a":"A","b":"B"},
                           {"year":"1902","c":"C","d":"D"},
                           {"year":"1903","e":"E","f":"F"},
                           {"year":"1904","g":"G","h":"H"},
                           {"year":"1905","i":"I","j":"J"}] })

print (df)

df['year'] = df['col3'].apply(lambda x: x['year'])
print (df)
 

Вывод для приведенного выше кода:

Исходный кадр данных:

    col1  col2                                  col3
0  Jack   100  {'year': '1901', 'a': 'A', 'b': 'B'}
1  Jill   200  {'year': '1902', 'c': 'C', 'd': 'D'}
2  Moon   300  {'year': '1903', 'e': 'E', 'f': 'F'}
3  Wall   400  {'year': '1904', 'g': 'G', 'h': 'H'}
4  Hill   500  {'year': '1905', 'i': 'I', 'j': 'J'}
 

Обновленный фрейм данных:

    col1  col2                                  col3  year
0  Jack   100  {'year': '1901', 'a': 'A', 'b': 'B'}  1901
1  Jill   200  {'year': '1902', 'c': 'C', 'd': 'D'}  1902
2  Moon   300  {'year': '1903', 'e': 'E', 'f': 'F'}  1903
3  Wall   400  {'year': '1904', 'g': 'G', 'h': 'H'}  1904
4  Hill   500  {'year': '1905', 'i': 'I', 'j': 'J'}  1905