заполнение столбцов панд на основе значений в других столбцах - PullRequest
0 голосов
/ 23 ноября 2018

Мой информационный фрейм содержит эти столбцы

ID   Address1   Address1-State   Address1-City  Address2  Address2-State  Address2-City   Address    State      City
 1    6th street   MN              Mpls
 2                                               15th St      MI           Flint
 3                 MA              Boston          Essex St   NY            New York
 4    7 street SE  MN              Mpls           8th St      IL             Chicago

Теперь я хочу заполнить поле «Адрес» таким образом, чтобы, если Адрес1 был пустым, заполнял Адрес2 и поля города штата в Адрес2

Вв последнем случае итоговый фрейм данных будет выглядеть так:

 ID     Address   State    City
  1      6th street   MN    Mpls
  2      15th St      MI    Flint
  3      Essex St     NY     New York
  4     7 street SE  MN     Mpls

В настоящее время я делаю это

def fill_add(address1,address2):
if address1!='':
    address=address1

elif address1=='' and address2!='':
    address=address2
elif address1=='' and address2=='':
     address=''

return address


def fill_add_apply(df):
df['Address']=df.apply(lambda row:fill_add(row['Address1'],row['Address2']),axis=1)

Должен ли я сделать то же самое для всех остальных столбцов? Есть ли лучшийway?

Просто чтобы уточнить, в ID = 3 Адрес, Штат, Город должны быть "Essex St NY New York", потому что Адрес 1 пуст, поэтому он должен выбрать Address2, а также город и штат Address2.Короче говоря, если Адрес1 пуст, он должен выбрать Адрес2, Адрес2-Штат и Адрес2-Город, даже если Адрес1-Штат и Адрес1-Город не пустые.

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

(учитывая, что у вас нет повторяющихся индексов)

Выберите индексы, которые вы хотите заполнить адресом Adress1:

Address1_index = df.loc[!df.Address1.empty() and !df.Address1-State.empty() and !df.Address1-City.empty()].index

, затем поместите данные Address1 в желаемые столбцы:

df.loc[Adress1_index, ["Adress", "State", "City"]] = df.loc[Adress1_index, ["Adress1", "Adress1-State", "Adress1-City"]]

Теперь выберите индексы, которые вы хотите заполнить адресом2:

Address2_index = df.loc[df.Adress1.empty() or df.Adress1-State.empty() or df.Adress1-City.empty()].index

, затем заполните их также:

df.loc[Adress2_index, ["Adress", "State", "City"]] = df.loc[Adress2_index, ["Adress2", "Adress2-State", "Adress2-City"]]

Удалите ненужные столбцы:

df.drop(["Address1", "Adress1-State", "Adress1-City", "Address2", "Adress2-State", "Adress2-City"], axis = 1, inplace = True)
0 голосов
/ 23 ноября 2018
import numpy as np

df=df.replace('',np.nan)

addr_1=['ID','Address1','Address1-State','Address1-City']
addr_2=['ID','Address2','Address2-State','Address2-City']

new_df=pd.DataFrame(df[addr_1].values.copy(),columns=['ID','Address','State','City'])

new_df.loc[new_df['Address'].isnull(),:]=df.loc[df['Address1'].isnull(),addr_2].values

#print(new_df)
    ID  Address     State   City
0   1   6th street  MN      Mpls
1   2   15th St     MI      Flint
2   3   Essex St    NY      New York
3   4   7 street SE MN      Mpls
0 голосов
/ 23 ноября 2018

1-й измените ваш столбец, затем используйте groupby + first

df=df.replace('',np.nan)#prepare for first 

df.columns=df.columns.str.replace('\d+','')
df.columns=df.columns.str.split('-').str[-1]
newdf=df.groupby(level=0,axis=1).first()
newdf.loc[df.iloc[:,1].isnull(),:]=df.groupby(level=0,axis=1).last()
newdf
Out[40]: 
       Address      City  ID State
0  6th street       Mpls   1    MN
1      15th St     Flint   2    MI
2    Essexb St  New York   3    NY
3  7 street SE      Mpls   4    MN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...