簡體   English   中英

使用 Pandas DataFrame 到 CSV 時,如何在每列上指定不同的十進制格式?

[英]How can I specify a different decimal format on each column when using Pandas DataFrame to CSV?

我正在解析文本文件中的特定列,其數據如下所示:

  n Elapsed time  TimeUTC HeightMSL GpsHeightMSL     P   Temp RH   Dewp   Dir Speed Ecomp Ncomp       Lat        Lon
                s hh:mm:ss         m            m   hPa     ∞C  %     ∞C     ∞   m/s   m/s   m/s         ∞          ∞
   1            0 23:15:43       198          198 978.5  33.70 47  20.87 168.0   7.7  -1.6   7.6 32.835222 -97.297940
   2            1 23:15:44       202          201 978.1  33.03 48  20.62 162.8   7.3  -2.2   7.0 32.835428 -97.298000
   3            2 23:15:45       206          206 977.6  32.89 48  20.58 160.8   7.5  -2.4   7.0 32.835560 -97.298077
   4            3 23:15:46       211          211 977.1  32.81 49  20.58 160.3   7.8  -2.6   7.4 32.835660 -97.298160
   5            4 23:15:47       217          217 976.5  32.74 49  20.51 160.5   8.3  -2.7   7.8 32.835751 -97.298242
   6            5 23:15:48       223          223 975.8  32.66 48  20.43 160.9   8.7  -2.8   8.2 32.835850 -97.298317

我對第一個 m/s 列執行一次計算(將 m/s 轉換為 kt)並將 hpa > 99.9 的所有數據寫入輸出文件。 該輸出如下所示:

978.5,198,33.7,20.87,168.0,14.967568
978.1,201,33.03,20.62,162.8,14.190032
977.6,206,32.89,20.58,160.8,14.5788
977.1,211,32.81,20.58,160.3,15.161952
976.5,217,32.74,20.51,160.5,16.133872
975.8,223,32.66,20.43,160.9,16.911407999999998

代碼執行良好,輸出文件適用於我使用它的目的,但是有沒有辦法將列輸出格式化為特定的小數位? 正如您在我的代碼中看到的那樣,我嘗試了 df.round 但它不會影響輸出。 我還查看了 float_format 參數,但這似乎會將格式應用於所有列。 我的預期輸出應如下所示:

978.5, 198, 33.7, 20.9, 168, 15
978.1, 201, 33.0, 20.6, 163, 14
977.6, 206, 32.9, 20.6, 161, 15
977.1, 211, 32.8, 20.6, 160, 15
976.5, 217, 32.7, 20.5, 161, 16
975.8, 223, 32.7, 20.4, 161, 17

我的代碼如下:

import pandas as pd

headers = ['n', 's', 'time', 'm1', 'm2', 'hpa', 't', 'rh', 'td', 'dir', 'spd', 'u', 'v', 'lat', 'lon']
df = pd.read_csv ('edt_20220520_2315.txt', encoding_errors = 'ignore', skiprows = 2, sep = '\s+', names = headers)

df['spdkt'] = df['spd'] * 1.94384

df['hpa'].round(decimals = 1)
df['spdkt'].round(decimals = 0)
df['t'].round(decimals = 1)
df['td'].round(decimals = 1)
df['dir'].round(decimals = 0)

extract = ['hpa', 'm2', 't', 'td', 'dir', 'spdkt']

with open('test_output.txt' , 'w') as fh:
    df_to_write = df[df['hpa'] > 99.9]
    df_to_write.to_csv(fh, header = None, index = None, columns = extract, sep = ',')

您可以傳遞字典,然后如果將列按0舍入為整數:

d = {'hpa':1, 'spdkt':0, 't':1, 'td':1, 'dir':0}
df = df.round(d).astype({k:'int' for k, v in d.items() if v == 0})

print (df)
   n  s      time   m1   m2    hpa     t  rh    td  dir  spd    u    v  \
0  1  0  23:15:43  198  198  978.5  33.7  47  20.9  168  7.7 -1.6  7.6   
1  2  1  23:15:44  202  201  978.1  33.0  48  20.6  163  7.3 -2.2  7.0   
2  3  2  23:15:45  206  206  977.6  32.9  48  20.6  161  7.5 -2.4  7.0   
3  4  3  23:15:46  211  211  977.1  32.8  49  20.6  160  7.8 -2.6  7.4   
4  5  4  23:15:47  217  217  976.5  32.7  49  20.5  160  8.3 -2.7  7.8   
5  6  5  23:15:48  223  223  975.8  32.7  48  20.4  161  8.7 -2.8  8.2   

         lat        lon  spdkt  
0  32.835222 -97.297940     15  
1  32.835428 -97.298000     14  
2  32.835560 -97.298077     15  
3  32.835660 -97.298160     15  
4  32.835751 -97.298242     16  
5  32.835850 -97.298317     17  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM