1

(実際の入力 CSV は、通常どおりコンマ区切りです。見やすくするために、アイデアを表として示しただけです。)

Python 2.7 を使用してやりたいことの例を次に示します (Pandas の方が優れているか簡単な場合ですが、Python ロジックを学習するのも好きで、pandas は多くのことをスキップしますが、このようなものについては学習する必要があるかもしれません):

から

Price    Name    Text      Number    Choice   URL         Email
$40      Foo     Stuff     560       Y        www.a.com   a@a.com
$60      Foo     Things    280       N        www.a.com   a@a.com
$20      Foo     Other     120       Y        www.a.com   a@a.com
$25      John    Gals      1222      N        www.b.com   b@b.com
$100     Bar     Dudes     999       Y        www.c.com   c@c.com
$250     Bar     Guys      200       Y        www.c.com   c@c.com

Name    Price1    Price2   Price3   Text1    Text2    Text3    Number1    Number2    Number3    Choice1    Choice2    Choice3    URL         Email
Foo     $40       $60      $20      Stuff    Things   Other    560        280        120        Y          N          Y          www.a.com   a@a.com
John    $25                         Gals                       1222                             N                                www.b.com   b@b.com
Bar     $100      $250              Dudes    Guys              999        200                   Y          Y                     www.c.com   c@c.com

列の順序は関係ありませんが、原則として名前列で結合したいと思います。(うまくいけば、例が苦痛だったので、正しく理解できました!)

余分な功績として、セルが空白の場合、セルが新しい列に入力されないようにしたいと思います。たとえば、上記のa@a.com行 2 が欠落している場合、「Email2」列は生成されず、同じように見えます。また、列の順序は重要ではありませんが (CSV 入力を必要とするデータベースにデータを入力するためにこれを使用しています)、番号付けは一致している必要があります。つまり、上記の Foo などの任意の名前について、$60、Things、280、および N はすべて、"[OrigName]2" とマークされた列にある必要があります。FromTo

これは簡単なはずですが、完全を期すために、入力されたテキスト列 (たとえば、整数列「テキスト数」) を合計する列と、「無料」とマークされた「価格」の数を合計する別の列も必要です (例: 「フリー テキストの数」)。

助けてくれてどうもありがとう - 私はこれから何を学ぶか、すでにワクワクしています。

4

2 に答える 2

2

[252]:

import pandas as pd
import io

f = io.BytesIO("""Price    Name    Text      Number    Choice   URL         Email
40      Foo     Stuff     560       Y        www.a.com   a@a.com
60      Foo     Things    280       N        www.a.com   
20      Foo     Other     120       Y        www.a.com   a@a.com
25      John    Gals      1222      N        www.b.com   b@b.com
100     Bar     Dudes     999       Y        www.c.com   c@c.com
250     Bar     Guys      200       Y        www.c.com   c@c.com""")

df = pd.read_csv(f, delim_whitespace=True)
print df

出力:

   Price  Name    Text  Number Choice        URL    Email
0     40   Foo   Stuff     560      Y  www.a.com  a@a.com
1     60   Foo  Things     280      N  www.a.com      NaN
2     20   Foo   Other     120      Y  www.a.com  a@a.com
3     25  John    Gals    1222      N  www.b.com  b@b.com
4    100   Bar   Dudes     999      Y  www.c.com  c@c.com
5    250   Bar    Guys     200      Y  www.c.com  c@c.com

[253]:

split_columns = ["Price", "Text", "Number", "Choice"]

def split_func(df):
    return df.set_index(np.arange(1, df.shape[0]+1))

df2 = df[split_columns].groupby(df.Name).apply(split_func).unstack()
df2.columns = [name+str(i) for name, i in df2.columns]
print df2

出力:

      Price1  Price2  Price3  Text1   Text2  Text3  Number1  Number2  Number3  \
Name                                                                            
Bar      100     250     NaN  Dudes    Guys    NaN      999      200      NaN   
Foo       40      60      20  Stuff  Things  Other      560      280      120   
John      25     NaN     NaN   Gals     NaN    NaN     1222      NaN      NaN   

     Choice1 Choice2 Choice3  
Name                          
Bar        Y       Y     NaN  
Foo        Y       N       Y  
John       N     NaN     NaN  

[245]:

unique_columns = ["URL", "Email"]

def unique_func(s):
    return s.dropna().unique()[0]

df3 = df[unique_columns].groupby(df.Name).agg(unique_func)
print df3

出力:

            URL    Email
Name                    
Bar   www.c.com  c@c.com
Foo   www.a.com  a@a.com
John  www.b.com  b@b.com

[246]:

print pd.merge(df2, df3, left_index=True, right_index=True)

出力:

      Price1  Price2  Price3  Text1   Text2  Text3  Number1  Number2  Number3  \
Name                                                                            
Bar      100     250     NaN  Dudes    Guys    NaN      999      200      NaN   
Foo       40      60      20  Stuff  Things  Other      560      280      120   
John      25     NaN     NaN   Gals     NaN    NaN     1222      NaN      NaN   

     Choice1 Choice2 Choice3        URL    Email  
Name                                              
Bar        Y       Y     NaN  www.c.com  c@c.com  
Foo        Y       N       Y  www.a.com  a@a.com  
John       N     NaN     NaN  www.b.com  b@b.com  
于 2013-11-06T03:29:38.723 に答える