簡體   English   中英

在python中更改CSV文件

[英]Changing CSV files in python

我有一堆4行標題的CSV文件。 在這些文件中,我想根據第二列中的值更改第六列中的值。 例如,如果在PRODUCT名稱下的第二列是Banana ,我想將TIME下同一行中的值更改為10m 如果產品是Apple我希望時間是15m ,依此類推。

When    12:07           
Area    Produce             
Store Name   FF             
Eatfresh                    
PN  PRODUCT NUMBER  INV ENT TIME
1    Banana 600000                5m
2    Apple  400000       F4        8m                                              
3    Pair                       6m
4    Banana 4000     G3            7m
5    Watermelon 700000          13m
6    Orange 12000               2m
7    Apple  1650000         6m

期望的輸出

When    12:07           
Area    Produce             
Store Name   FF             
Eatfresh                    
PN  PRODUCT NUMBER  INV ENT TIME
1    Banana 600000                10m
2    Apple  400000       F4        15m                                              
3    Pair                       6m
4    Banana 4000     G3            10m
5    Watermelon 700000          13m
6    Orange 12000               2m
7    Apple  1650000         15m

我想將所有輸出都輸出到目錄調用NTime 到目前為止,這是我的全部知識,但是我還是編碼新手,我不太了解很多知識,並且對如何進行實際的更改一無所知。 我發現了if / then / else的Python / pandas習慣用法 ,這似乎與我想做的事情相似,但是我不完全了解發生了什么。

import pandas as pd
import glob
import os

fns = glob.glob('*.csv') 
colname1 = 'PRODUCT'
colname2 = 'TIME'

for csv in fns:
    s = pd.read_csv(csv, usecols=[colname1], squeeze=True, skiprows=4, header=0)



    with open(os.path.join('NTime', fn), 'wb') as f:

有人能幫我嗎?

您可以結合使用groupbyreplacedict

In [76]: from pandas import DataFrame

In [77]: fruits = ['banana', 'apple', 'pear', 'banana', 'watermelon', 'orange', 'apple']

In [78]: times = ['5m', '8m', '6m', '7m', '13m', '2m', '6m']

In [79]: time_map = {'banana': '10m', 'apple': '15m', 'pear': '5m'}

In [80]: df = DataFrame({'fruits': fruits, 'time': times})
Out[80]:
       fruits time
0      banana   5m
1       apple   8m
2        pear   6m
3      banana   7m
4  watermelon  13m
5      orange   2m
6       apple   6m

In [81]: def replacer(g, time_map):
   ....:     tv = g.time.values
   ....:     return g.replace(to_replace=tv, value=time_map.get(g.name, tv))

In [82]: df.groupby('fruits').apply(replacer, time_map)
Out[82]:
       fruits time
0      banana  10m
1       apple  15m
2        pear   5m
3      banana  10m
4  watermelon  13m
5      orange   2m
6       apple  15m

您說您是編程新手,所以我將解釋發生了什么。

  1. df.groupby('fruits')拆分DataFrame划分成子集(其是DataFrame S或Series使用的值的對象) fruits柱。

  2. apply方法將函數應用於上述每個子集,並將結果連接起來(如果需要)。

  3. replacer就是“神奇”發生了:每個組的time值會被替換( to_replace )與在定義新的價值time_map 如果您要搜索的鍵(在這種情況下為水果名稱)不存在,則dictget方法可以提供默認值。 nan通常用於此目的,但是如果time_map dict沒有為它定義一個新的時間,那么實際上我只是在這里使用已經存在的時間。

要注意的一件事是我對g.name使用。 它通常不作為DataFrame的屬性存在(當然,您可以根據需要自行定義),但是在那里,因此您可以執行可能需要組名的計算。 在這種情況下,這就是應用功能時要查看的“當前”成果。

如果每個水果都有一個新值,或者手動輸入舊值,則可以將其縮短為單線:

In [130]: time_map = {'banana': '10m', 'apple': '15m', 'pear': '5m', 'orange': '10m', 'watermelon': '100m'
}

In [131]: s = Series(time_map, name='time')

In [132]: s[df.fruits]
Out[132]:
fruits
banana         10m
apple          15m
pear            5m
banana         10m
watermelon    100m
orange         10m
apple          15m
Name: time, dtype: object

In [133]: s[df.fruits].reset_index()
Out[133]:
       fruits  time
0      banana   10m
1       apple   15m
2        pear    5m
3      banana   10m
4  watermelon  100m
5      orange   10m
6       apple   15m

假設您的數據在Pandas DataFrame中,並且看起來像這樣:

PN  PRODUCT NUMBER  INV ENT TIME
1    Banana 600000                10m
2    Apple  400000       F4        15m                                              
3    Pair                       6m
4    Banana 4000     G3            10m
5    Watermelon 700000          13m
6    Orange 12000               2m
7    Apple  1650000         15m

然后,您應該能夠使用像這樣的簡單循環,根據另一列(同一行)中的值來處理一列中的值:

for numi, i in enumerate(df["PRODUCT"]):
    if i == "Banana":
        df["TIME"][numi] = "10m"
    if i == "Apple":
        df["TIME"][numi] = "15m"

代碼首先循環遍歷數據框列“ PRODUCT”的行,其中行值存儲為i,行號存儲為numi。 然后,它使用if語句在“產品”列中標識不同的興趣級別。 對於具有感興趣級別的那些行(例如“香蕉”或“蘋果”),它將使用行號更改同一行中另一列的值。

有很多方法可以執行此操作,並且根據數據大小和要更改的級別數(在本例中為“產品”),這不一定是最有效的方法。 但是,由於您是初學者,因此從一開始,這可能是一個很好的基本方法。

暫無
暫無

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

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