[英]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:
有人能幫我嗎?
您可以結合使用groupby
, replace
和dict
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
您說您是編程新手,所以我將解釋發生了什么。
df.groupby('fruits')
拆分DataFrame
划分成子集(其是DataFrame
S或Series
使用的值的對象) fruits
柱。
apply
方法將函數應用於上述每個子集,並將結果連接起來(如果需要)。
replacer
就是“神奇”發生了:每個組的time
值會被替換( to_replace
)與在定義新的價值time_map
。 如果您要搜索的鍵(在這種情況下為水果名稱)不存在,則dict
的get
方法可以提供默認值。 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.