#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