首页 > 解决方案 > Pandas 逐行读取数据

问题描述

我有一个看起来像这样的 csv 文件

纬度 日期1 日期2 日期3
120.55 23.2 1 2 3
1.66 2.3 4 5 6

我想将它导入到 sqlite 数据库,如下所示:

纬度 日期
120.55 23.2 1
120.55 23.2 2
120.55 23.2 3
1.66 2.3 4
1.66 2.3 5
1.66 2.3 6

所以我尝试了以下代码

df=pd.read_csv(root+"/"+i,index_col=False)              
            for j in range(df.shape[0]):
                for k in range(df.shape[1]):
                    lon="'"+str(df[' LON'][j])+"'"
                    lat="'"+str(df[' LAT'][j])+"'"                                          
                    for data_i in df.columns.tolist()[2:]:                                                      
                        value="'"+str(df[data_i][k])+"'"                            
                        insert_data='INSERT INTO day_wl_1 VALUES (%s,%s.%s)' %(lon,lat,value)
                        

它会产生相同的纬度但不同行的日期

纬度 日期
120.55 23.2 1
120.55 23.2 2
120.55 23.2 3
120.55 23.2 4
120.55 23.2 5
120.55 23.2 6

如何解决?

标签: pythonpandassqlite

解决方案


你有两个选择。选项一使用stack

df.set_index(['lon', 'lat'])
  .stack()
  .rename('date')
  .reset_index(level=2, drop=True)
  .reset_index()

       lon   lat  date
0   120.55  23.2     1
1   120.55  23.2     2
2   120.55  23.2     3
3   120.66  23.3     4
4   120.66  23.3     5
5   120.66  23.3     6
6   120.77  23.4     7
7   120.77  23.4     8
8   120.77  23.4     9
9   120.88  23.5    10
10  120.88  23.5    11
11  120.88  23.5    12

选项二使用melt

pd.melt(df, id_vars=['lon', 'lat'], value_vars=['date1', 'date2', 'date3'], value_name='date')
  .drop('variable', axis=1)

       lon   lat  date
0   120.55  23.2     1
1   120.66  23.3     4
2   120.77  23.4     7
3   120.88  23.5    10
4   120.55  23.2     2
5   120.66  23.3     5
6   120.77  23.4     8
7   120.88  23.5    11
8   120.55  23.2     3
9   120.66  23.3     6
10  120.77  23.4     9
11  120.88  23.5    12

推荐阅读