Ошибка атрибута: объект ‘Series’ не имеет атрибута ‘startswith’ при использовании условия фрейма данных pandas

#python #pandas

#python #pandas

Вопрос:

info.csv Данным нравится это:

 device_id,upload_time,latitude,longitude,mileage,other_vals,speed,upload_time_add_8hour,upload_time_year_month,car_id,car_type,car_num,marketer_name
1234567890123,2020-09-27 02:41:02 00:00,38.01946,114.425888,0,,0,2020/9/27 10:41,202009,,,12,
17100000001,2020-09-27 02:41:01 00:00,38.01946,114.425888,0,,0,2020/9/27 10:41,202009,,,12345,
17200000002,2020-09-25 13:46:38 00:00,38.01946,114.425888,0,,0,2020/9/25 21:46,202009,,,123456,
14111111111,2020-09-25 11:18:54 00:00,38.01946,114.425888,0,,0,2020/9/25 19:18,202009,,,12121212,
57c1e18249727a0b,2020-09-25 11:18:42 00:00,38.01946,114.425888,0,,0,2020/9/25 19:18,202009,,,,
57c1e18249727a0b,2020-09-23 10:16:55 00:00,38.01946,114.425888,0.055559317,,0,2020/9/23 18:16,202009,,,,
57c1e18249727a0b,2020-09-23 10:16:15 00:00,38.01946,114.425888,0.055559317,,0,2020/9/23 18:16,202009,,,,
57c1e18249727a0b,2020-09-23 10:15:35 00:00,38.01946,114.425888,0.055559317,,0,2020/9/23 18:15,202009,,,,
57c1e18249727a0b,2020-09-23 10:15:04 00:00,38.01946,114.425888,0.055559317,,0,2020/9/23 18:15,202009,,,,
57c1e18249727a0b,2020-09-23 10:14:55 00:00,38.01946,114.425888,0.055559317,,3.304916399,2020/9/23 18:14,202009,,,,
  

Я использую этот код для разделения фрейма данных на вложенный фрейм данных.

 import pandas as pd

df = pd.read_csv(r'info.csv', encoding='utf-8')
df_1 = df[df['device_id'].astype(str).map(len) !=11]
df_2 = df[df['device_id'].astype(str).map(len)==11 amp; df['device_id'].astype(str).startswith('17')]#device_id start with 17
df_3 = df[df['device_id'].astype(str).map(len)==11 amp; ~df['device_id'].astype(str).startswith('17')] #device_id doesn't start with 17
df = df[pd.notnull(df['car_num'])] 
print(len(df_1))
print(len(df_2))
print(len(df_3))
  

Но сообщение об ошибке:

Ошибка атрибута: объект ‘Series’ не имеет атрибута ‘startswith’

Как это исправить?

Ответ №1:

Использовать .str.startswith :

 df_2 = df[df['device_id'].astype(str).map(len)==11 amp; df['device_id'].astype(str).str.startswith('17')]#device_id start with 17
  

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

 s = df['device_id'].astype(str)
lens = s.str.len()

df_1 = df[(lens!=11)]
df_2 = df[(lens==11) amp; s.str.startswith('17')]#device_id start with 17
df_3 = df[(lens==11) amp; ~s.str.startswith('17')] #device_id doesn't start with 17
df = df[df['car_num'].notna()] 
  

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

1. Привет, а как насчет device_id, который не начинается с 17?

2. @CR7 — Таким же образом. Работаю над ответом.

Ответ №2:

Серии Pandas не имеют вызываемого атрибута startswith . Согласно документации pandas startswith, так и должно быть Pandas.Series.str.startswith .

Вместо использования .startswith('17') используйте .str.startswith('17') .

 import pandas as pd

df = pd.read_csv(r'info.csv', encoding = "utf-8")
df_1 = df[df['device_id'].astype(str).map(len) !=11]
df_2 = df[df['device_id'].astype(str).map(len)==11 amp; df['device_id'].astype(str).str.startswith('17')]#device_id start with 17
df_3 = df[df['device_id'].astype(str).map(len)==11 amp; ~df['device_id'].astype(str).str.startswith('17')] #device_id doesn't start with 17
df = df[pd.notnull(df['car_num'])] 
print(len(df_1))
print(len(df_2))
print(len(df_3))