Разделить списки с неопределенными элементами на разные категории (используя pandas) - PullRequest
0 голосов
/ 06 марта 2020

У меня проблемы с pandas сплитом. Итак, у меня есть столбец данных, который выглядит примерно так:

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

index | Address
0     | [123 New York St]
1     | [Amazing Building, 23 New Jersey St, 2F]
2     | [98 New Mexico Ave, 16F]
3     | [White House, 1600 Pennsylvania Ave, PH]
4     | [221 Baker Street]
5     | [Hogwarts]

Как видите, список содержит различные категории и количество элементов , У некоторых есть названия зданий наряду с адресами. У некоторых есть только адреса с этажами здания. Я хочу отсортировать их по категориям (название здания, адрес, номер единицы / этажа), но у меня возникают проблемы с поиском решения этой проблемы, так как я начинающий python & pandas ученик.

Как разделить адреса на разные категории, чтобы получить вывод, похожий на этот, предполагая, что имена зданий ВСЕ начинаются с алфавита, и я могу поставить Null для категорий с отсутствующим значением?

Требуемый вывод:

index | Building Name    | Address               | Unit Number
0     | Null             | 123 New York St       | Null
1     | Amazing Building | 23 New Jersery St.    | 2F
2     | Null             | 98 New Mexico Ave.    | 16F
3     | White House      | 1600 Pennsylvania Ave | PH
4     | Null             | 221B Baker St         | Null
5     | Hogwarts         | Null                  | Null

Главное, что мне нужно, чтобы все адреса были в столбце адресов. Спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 06 марта 2020

предварительное условие: название здания начинается с символа, а не с цифры

Если имя здания начинается с цифры, может быть выведен неверный результат.

  import pandas as pd

  df = pd.DataFrame({'addr' : ['123 New York St', 
                     'Amzing Building, 23 New Jersey St, 2F',
                     '98 New Mexico Ave, 16F']})
  # Check the number of items in the address value
  df['addr'] = df['addr'].str.split(',')
  df['cnt'] = df['addr'].apply(lambda x: len(x)).values

  # function, Building name start letter check
  def CheckInt(s):
      try:
          int(s[0])
          return True
      except ValueError:
          return False

  for i, v in df.iterrows():
      # One item of address value
      if v.cnt == 1:
          df.loc[i,'Address'] = v.addr
      # Three items of address value
      elif v.cnt == 3:
          df.loc[i,'Building'] = v.addr[0]
          df.loc[i,'Address'] = v.addr[1]
          df.loc[i,'Unit'] = v.addr[2]
      # Two items of address value
      else:
          if CheckInt(v.addr[0]):
              df.loc[i,'Address'] = v.addr[0]
              df.loc[i,'Unit'] = v.addr[1]
          else:
              df.loc[i,'Building'] = v.addr[0]
              df.loc[i,'Address'] = v.addr[1]
0 голосов
/ 06 марта 2020

Мы можем получить вывод для вашего входного кадра данных, как показано ниже. Если данные отличаются, вам, возможно, придется повозиться.

df['com_Address'] = df[' Address'].apply(lambda x: x.replace('[','').replace(']','')).str.split(',')
st_list= ['St','Ave']
df['St_Address']=df.apply(lambda x: [a if st in a  else '' for st in st_list for a in x['com_Address']],axis=1)
df['St_Address']=df['St_Address'].apply(lambda x:[i for i in x if i]).astype(str).apply(lambda x: x.strip("[]'"))
df['Building Name']=df.apply(lambda x: [x['com_Address'][0] if len(x['com_Address'])==3 else 'Null'],axis=1).astype(str).apply(lambda x: x.strip("[]'"))
df['Building Name']=df.apply(lambda x: np.where((len(x['com_Address'])==1) & (x['St_Address']==''),x['com_Address'][0],x['Building Name']),axis=1)
df['Unit Number']=df.apply(lambda x: [x['com_Address'][2] if len(x['com_Address'])==3 else 'Null'],axis=1).astype(str).apply(lambda x: x.strip("[]'"))
df['Unit Number']=df.apply(lambda x: np.where((len(x['com_Address'])==2) & (x['St_Address']!=''),x['com_Address'][-1],x['Unit Number']),axis=1)
df

Столбец com_Address является необязательным. Я должен был создать его, потому что «Адрес» из вашего ввода пришел ко мне как строка, а не как список. Если у вас уже есть список, вам это не нужно, и вам придется обновить «com_Address» на «Address» в коде.

Вывод

index   Address                                     com_Address                                Building Name    St_Address  Unit Number
0   0   [123 New York St]                           [ 123 New York St]                         Null           123 New York St   Null
1   1   [Amazing Building, 23 New Jersey St, 2F]    [ Amazing Building, 23 New Jersey St, 2F]  Amazing Building     23 New Jersey St    2F
2   2   [98 New Mexico Ave, 16F]                    [ 98 New Mexico Ave, 16F]                  Null     98 New Mexico Ave   16F
3   3   [White House, 1600 Pennsylvania Ave, PH]    [ White House, 1600 Pennsylvania Ave, PH]  White House  1600 Pennsylvania Ave   PH
4   4   [221 Baker Street]                          [ 221 Baker Street]                        Null     221 Baker Street    Null
5   5   [Hogwarts]                                  [ Hogwarts]                                Hogwarts         Null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...