#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))