Удалить строки на основе длины с плавающей точкой в ​​Python - PullRequest
0 голосов
/ 26 ноября 2018

Помимо прочего, у меня есть DataFrame с почтовыми индексами.Данные в качестве примера выглядят так:

     Zip    Item1     Item2   Item3
 78264.0      pan  elephant    blue
 73909.0  steamer     panda  yellow
  2602.0      pot     rhino  orange
 59661.0     fork     zebra   green
861893.0     sink    ocelot     red
 77892.0  spatula    doggie   brown

Некоторые из этих почтовых индексов недействительны, имеют слишком много или слишком мало цифр.Я пытаюсь удалить те строки, которые имеют недопустимое количество символов / цифр (в данном случае семь символов, потому что я проверяю длину на основе str(), и туда включается .0).Следующий цикл lengths:

zips = mydata.iloc[:,0].astype(str)
lengths = []
for i in zips:
    lengths.append(len(i))

создает серию (не путать с Series, хотя, возможно, это - я новичок в Python) длин символов почтового индекса для каждой строки.Затем я пытаюсь установить подмножество DataFrame на основе информации из переменной lengths.Я пробовал пару разных способов;это была последняя версия:

for i in lengths.index(i):
    if mydata.iloc[i:,0] != 7:
        mydata.iloc[i:,0].drop()

Естественно, это не удалось, с ошибкой ValueError: '44114.0' is not in list.Кто-нибудь может дать какой-нибудь совет, как сделать то, что я пытаюсь сделать?

Ответы [ 3 ]

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

Использование str.len

df[df.iloc[:,0].astype(str).str.len()!=7]
          A
1  1.222222
2  1.222200

dput:

df=pd.DataFrame({'A':[1.22222,1.222222,1.2222]})
0 голосов
/ 26 ноября 2018

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

Вот пример:

valid_zips = mydata[mydata.astype(str).str.len() == 7]

или

zip_code_upper_bound = 100000
valid_zips = mydata[mydata < zip_code_upper_bound]

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

Пример вывода:

С определением dfкак (из вашего примера):

        Zip    Item1     Item2   Item3
0   78264.0      pan  elephant    blue
1   73909.0  steamer     panda  yellow
2    2602.0      pot     rhino  orange
3   59661.0     fork     zebra   green
4  861893.0     sink    ocelot     red
5   77892.0  spatula    doggie   brown

Используя следующий код:

df[df.Zip.astype(str).str.len() == 7]

Результат:

       Zip    Item1     Item2   Item3
0  78264.0      pan  elephant    blue
1  73909.0  steamer     panda  yellow
3  59661.0     fork     zebra   green
5  77892.0  spatula    doggie   brown
0 голосов
/ 26 ноября 2018

Посмотрите, работает ли это

df1 = df['ZipCode'].astype(str).map(len)==5

...