Как обрезать список в столбце фрейма данных pandas

#python #pandas

#python #pandas

Вопрос:

Я вроде как новичок в python / pandas.

Я преобразовал json в csv. Теперь один столбец по-прежнему выглядит так и содержит несколько атрибутов.

                                             location
0  {'country': 'United States', 'state': 'New Jer...
1  {'country': 'Australia', 'state': 'Queensland'...
2  {'country': 'United States', 'state': 'Texas',...
3  {'country': 'Australia', 'state': None, 'city'...
4  {'country': 'United States', 'state': 'Califor...
  

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

         location
0  United States
1  Australia
2  United States
3  Australia
4  United States
  

Любая помощь высоко ценится.

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

1. Что такое print (type(df.loc[0, 'location'])) ?

Ответ №1:

Если столбец заполнен словарями, используйте:

 print (type(df.loc[0, 'location']))
<class 'dict'>

df['location'] = df['location'].str.get('country')
print (df)
        location
0  United States
1      Australia
2  United States
3      Australia
4  United States
  

Если есть строки:

 print (type(df.loc[0, 'location']))
<class 'str'>

import ast

df['location'] = df['location'].apply(ast.literal_eval).str.get('country')

print (df)
        location
0  United States
1      Australia
2  United States
3      Australia
4  United States
  

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

1. Быстрый последующий вопрос: Ваш ответ сработал отлично. Но теперь я получаю дополнительный первый столбец с именем «Безымянный: 0», который просто содержит индекс (я использовал ваш второй способ со строками). Я могу просто удалить его, но есть ли способ не создавать его в первую очередь?

2. @BenW — Значения похожи print (df.index) ? И вам нужно избегать этого при записи в файл csv? Затем используйте df.to_csv(file, index=False)

Ответ №2:

Вы можете создать фрейм данных непосредственно из списка словарей с похожими ключами. Поэтому вам просто нужно перевести элементы в столбце в форму списка, прежде чем создавать свой новый фрейм данных. Ключи в списке dicts становятся новыми столбцами.

Это можно решить с помощью одной строки кода —

 df = pd.DataFrame({'Location':[{'country': 'United States', 'state': 'New Jersey'},
                               {'country': 'Australia', 'state': 'Queensland'},
                               {'country': 'United States', 'state': 'Texas'}]})


#Building a dataframe directly from a list of dictionaries with similar keys
df2 = pd.DataFrame(list(df['Location'].values))
print(df2)
  
          country       state
0  United States  New Jersey
1      Australia  Queensland
2  United States       Texas
  

Ответ №3:

Прочитайте Json напрямую, например:

 import pandas as pd
df = pd.read_json ('jsnotation.json')
  

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

     Country    State
0   USA        Texas
1   Australia  Qeensland
2   USA        California
  

Теперь вы можете получить желаемый результат, например:

 print(df['country'])

   Country    
0   USA       
1   Australia 
2   USA       
  

Чтобы изменить заголовок:

 df = df.rename(columns={'Country': 'Location'})
  

Ответ №4:

Я предполагаю, что если вы запустили:

type(df["Location"][0])

в качестве выходных данных вы получите «str» (df — это фрейм данных csv, который вы читаете).

При этом существует 2 способа решения этой проблемы:

  1. Преобразуйте строки в словари и извлеките пары ключ / значение в столбцы

Вы можете сделать это, выполнив:

import ast

df["location"] = df["location"].apply(lambda x: ast.literal_eval(x))

Это займет каждую строку в вашем фрейме данных и преобразует строковые представления в требуемый словарный тип данных для обработки. Далее мы можем извлечь значения в столбцы вручную, запустив (взяв в качестве примера столбец «страна»):

df['location'] = df['location'].str.get('country')

Что даст вам желаемый результат.

  1. Избегайте преобразования ваших данных в csv и считывайте напрямую из файла json

Библиотека Pandas включает функцию pd.read_json, которая может обрабатывать .json для фреймов данных pandas.

pd.read_json (r'Path where you saved the JSON fileFile Name.json')