0

4行のヘッダーを持つCSVファイルがたくさんあります。これらのファイルで、2 列目の値に基づいて 6 列目の値を変更したいと考えています。たとえば、名前の下の 2 番目の列がPRODUCTBanana場合、同じ行の下の値を に変更し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:

誰かが私を助けることができますか?

4

2 に答える 2

1

との組み合わせでこれを行うことができgroupbyますreplacedict

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をサブセット ( DataFrames またはオブジェクト) に分割します。Seriesfruits

  2. このapplyメソッドは、前述の各サブセットに関数を適用し、結果を連結します (必要な場合)。

  3. replacerここで「魔法」が起こります。各グループの値は、で定義された新しいtime値に置き換えられます ( to_replace) 。sのメソッドを使用すると、探しているキー (この場合は果物の名前) が存在しない場合に、既定値を指定できます。はこの目的で一般的に使用されますが、ここでは、.time_mapgetdictnantime_map dict

注意すべきことの 1 つは、 の使用ですg.name。これは通常、 s の属性として存在しません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
于 2013-08-29T23:00:04.380 に答える
0

データが 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

次に、次のような単純なループを使用して、別の列 (同じ行) の値に基づいて 1 つの列の値を操作できるはずです。

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 ステートメントを使用して、Product 列のさまざまなレベルの関心を識別します。関心のレベルを持つ行 (「バナナ」や「リンゴ」など) では、行番号を使用して同じ行の別の列の値を変更します。

これを行うには多くの方法があり、変更するデータのサイズとレベル (この場合は「製品」) の数によっては、これが必ずしも最も効率的な方法とは限りません。しかし、あなたは初心者なので、これはおそらく最初の基本的な方法です。

于 2013-08-29T21:54:39.577 に答える