我正在为 Coursera 上的谷歌课程开发一个数据分析项目。这是一家假设的乘车共享公司,正在努力增加利润,并希望制定一项营销策略,将休闲乘客转变为正式会员(每年会员订阅。
我的工作是弄清楚会员和休闲骑手如何以不同的方式使用自行车共享系统。我必须下载并探索 2023 年的数据。一年中的每个月都有一个数据集。
我有 12 个 .csv 文件(2023 年每个月一个),我必须使用 pd.concat() 连接它们。每个文件都有相同的 13 个标头。 (文件链接如下)。
链接
https://divvy-tripdata.s3.amazonaws.com/index.html
打开链接时选择这些文件:
202301-divvy-tripdata.zip 2023 年 2 月 7 日,下午 02:58:38 6.78 MB ZIP 文件
202302-divvy-tripdata.zip 2023 年 3 月 7 日,下午 05:28:12 7.08 MB ZIP 文件
202303-divvy-tripdata.zip 2023 年 4 月 6 日,下午 04:38:59 10.27 MB ZIP 文件
202304-divvy-tripdata.zip 2023 年 5 月 4 日下午 03:43:25 15.40 MB ZIP 文件
202305-divvy-tripdata.zip 2023 年 6 月 8 日,下午 06:17:13 23.44 MB ZIP 文件
202306-divvy-tripdata.zip 2023 年 7 月 13 日,下午 05:22:44 25.66 MB ZIP 文件
202307-divvy-tripdata.zip 2023 年 8 月 14 日,上午 08:28:28 28.54 MB ZIP 文件
202308-divvy-tripdata.zip 2023 年 10 月 12 日,上午 01:35:18 28.65 MB ZIP 文件
202309-divvy-tripdata.zip 2023 年 10 月 12 日,上午 01:35:18 24.89 MB ZIP 文件
202310-divvy-tripdata.zip 2023 年 11 月 13 日上午 11:38:10 19.15 MB ZIP 文件
202311-divvy-tripdata.zip 2023 年 12 月 5 日,下午 01:28:19 13.17 MB ZIP 文件
202312-divvy-tripdata.zip 2024 年 1 月 4 日,下午 02:48:23 8.42 MB ZIP 文件
我根据每个数据集包含的数据月份更改了每个数据集的文件名。
例如:
202303-divvy-tripdata.zip 2023 年 4 月 6 日,下午 04:38:59 10.27 MB ZIP 文件
更改为:
df_四月_2023
下载文件后,我将四月份导入 python pandas 中,以查看数据集的形状、dtypes、唯一值和空值,如下所示:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 426590 entries, 0 to 426589
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 ride_id 426590 non-null object
1 rideable_type 426590 non-null object
2 started_at 426590 non-null object
3 ended_at 426590 non-null object
4 start_station_name 362776 non-null object
5 start_station_id 362776 non-null object
6 end_station_name 357960 non-null object
7 end_station_id 357960 non-null object
8 start_lat 426590 non-null float64
9 start_lng 426590 non-null float64
10 end_lat 426155 non-null float64
11 end_lng 426155 non-null float64
12 member_casual 426590 non-null object
dtypes: float64(4), object(9)
memory usage: 42.3+ MB
#检查数据类型
df_April_2023.dtypes
ride_id object
rideable_type object
started_at object
ended_at object
start_station_name object
start_station_id object
end_station_name object
end_station_id object
start_lat float64
start_lng float64
end_lat float64
end_lng float64
member_casual object
dtype: object
#检查每个字段中的唯一值。
df_April_2023.nunique()
ride_id 426590
rideable_type 3
started_at 368670
ended_at 369541
start_station_name 1069
start_station_id 1032
end_station_name 1071
end_station_id 1037
start_lat 151510
start_lng 149608
end_lat 958
end_lng 948
member_casual 2
dtype: int64
#检查每个字段中的空值。
df_April_2023.isnull().sum()
ride_id 0
rideable_type 0
started_at 0
ended_at 0
start_station_name 63814
start_station_id 63814
end_station_name 68630
end_station_id 68630
start_lat 0
start_lng 0
end_lat 435
end_lng 435
member_casual 0
dtype: int64
我将 2023 年其他 11 个月的数据导入 pandas 并使用以下语句创建了一个列表:
df_2023 = [df_January_2023, df_February_2023, df_March_2023,
df_April_2023, df_May_2023, df_June_2023, df_July_2023,
df_August_2023, df_September_2023, df_October_2023,
df_November_2023,df_December_2023]
以下是按从一月到十二月的顺序每个文件的结构:
for structure in df_2023:
print(structure.info(verbose = False))
print("end of csv")
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 190303 entries, 0 to 190302
Columns: 13 entries, ride_id to member_casual
dtypes: float64(4), object(9)
memory usage: 18.9+ MB
None
end of csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 190445 entries, 0 to 190444
Columns: 13 entries, ride_id to member_casual
dtypes: float64(4), object(9)
memory usage: 18.9+ MB
None
end of csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 258678 entries, 0 to 258677
Columns: 13 entries, ride_id to member_casual
dtypes: float64(4), object(9)
memory usage: 25.7+ MB
None
end of csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 426590 entries, 0 to 426589
Columns: 13 entries, ride_id to member_casual
dtypes: float64(4), object(9)
memory usage: 42.3+ MB
None
end of csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 604827 entries, 0 to 604826
Columns: 13 entries, ride_id to member_casual
dtypes: float64(4), object(9)
memory usage: 60.0+ MB
None
end of csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 719618 entries, 0 to 719617
Columns: 13 entries, ride_id to member_casual
dtypes: float64(4), object(9)
memory usage: 71.4+ MB
None
end of csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 767650 entries, 0 to 767649
Columns: 13 entries, ride_id to member_casual
dtypes: float64(4), object(9)
memory usage: 76.1+ MB
None
end of csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 771693 entries, 0 to 771692
Columns: 13 entries, ride_id to member_casual
dtypes: float64(4), object(9)
memory usage: 76.5+ MB
None
end of csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 666371 entries, 0 to 666370
Columns: 13 entries, ride_id to member_casual
dtypes: float64(4), object(9)
memory usage: 66.1+ MB
None
end of csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 537113 entries, 0 to 537112
Columns: 13 entries, ride_id to member_casual
dtypes: float64(4), object(9)
memory usage: 53.3+ MB
None
end of csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 362518 entries, 0 to 362517
Columns: 13 entries, ride_id to member_casual
dtypes: float64(4), object(9)
memory usage: 36.0+ MB
None
end of csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 224073 entries, 0 to 224072
Columns: 13 entries, ride_id to member_casual
dtypes: float64(4), object(9)
memory usage: 22.2+ MB
None
end of csv
如果添加每个单独数据集的条目数,您将得到总计:
5,719,879 行数据
这是我开始遇到问题的地方。查看每个单独数据集的形状和结构后,我发现每个数据集的所有列都相同,数据类型也相似。
我连接了所有数据集,以便更轻松地清理和操作数据。
用于连接的语句:
df_2023_rides = pd.concat([df_January_2023, df_February_2023,
df_March_2023, df_April_2023, df_May_2023,
df_June_2023, df_July_2023, df_September_2023,
df_October_2023, df_November_2023, df_December_2023],
axis = 0)
所有 12 个数据集的串联结果产生:
4,948,186 行和 13 列。
这意味着在串联过程中我丢失了 771,693 行数据。
我不知道是什么原因导致数据丢失。不知道是我漏掉了什么还是concat语句写错了?
我已尝试包含重现相同结果所需的所有信息,因为最初在发布此问题时我没有这样做。
Joe,我未能用您给定的数据集重复您的问题。
import pandas as pd
l = []
for i in range(1,13):
l.append(pd.read_csv(f'Downloads/data/2023{str(i).zfill(2)}-divvy-tripdata.csv'))
total_lines = 0
for df in l:
print(df.shape)
total_lines += df.shape[0]
print(f'{total_lines=}')
print(pd.concat(l, axis=0).shape)
输出:
(190301, 13)
(190445, 13)
(258678, 13)
(426590, 13)
(604827, 13)
(719618, 13)
(767650, 13)
(771693, 13)
(666371, 13)
(537113, 13)
(362518, 13)
(224073, 13)
total_lines=5719877
(5719877, 13)
单个数据帧的行数等于 pd.concat 数据帧的行数。