串联 csv 文件的问题

问题描述 投票:0回答:1

我正在为 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语句写错了?

我已尝试包含重现相同结果所需的所有信息,因为最初在发布此问题时我没有这样做。

pandas csv concatenation
1个回答
0
投票

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 数据帧的行数。

© www.soinside.com 2019 - 2024. All rights reserved.