excelのファイルで  
[![画像の説明をここに入力](https://i.stack.imgur.com/WgCJk.png)](https://i.stack.imgur.com/WgCJk.png)

「  
<https://www.leafkyoto.net/special/parfait/>  
<https://tabelog.com/kyoto/A2601/A260503/26001772/>  
」  
↑が記入されているセルが縦に連続しています

このように二種類のリンクが混合してる列があります。  
この隣に後者のリンクだけを抽出した列を作りたいと思っています。  
色々なサイトを巡っていますがpandasでのちょっとしたcsvの読み書きの書き方がどうしてもわからないのでご教授ください。  
列名は所与でtabelogという名前で作っておいて、その列に変換したurlを順に入れていく、、、ということは可能ですか？

```

    import csv
    import pandas as pd
    x = pd.read_csv('output.csv')
    y = []
    for z in x:
        y = x[x.find("https://tabelog.com"):]
    df = df.append(y)
    df.to_csv('output.csv', columns=['tabelog'])
    print("finished")
    
```
CC BY-SA 4.0
2019-04-23T06:51:45.323
54418
2019-04-26T01:09:49.407
2019-04-23T07:43:41.973
32145
32145
question
python pandas csv
python pandasによるcsvの読み書き
```

    x = pd.read_csv('output.csv')
    
```

の次に、

```

    print( x.shape )
    
```

を追加して、xが 横２列（縦はExcelに入っているデータの行数）のデータフレームになっているか確認してください。  
質問にあるExcelの画面イメージではどこにもカンマ(,)が見当たらないので、read_csvで読み込むとxは横１列のデータフレームになっているのではないかと思います。  
read_csvは区切り文字(デフォールトは",")で分割して読み込むのですが、区切り文字がなければ区切られないまま（一続きで）１列のデータフレームになるはずです。

一つのセルに書かれた２つのリンクが何で区切られているのか画面では判断できないのですが、改行文字(LF("\n" :
文字コード:0x0A))で区切られているのだとすれば、

```

    x = pd.read_csv('output.csv',sep="\n")
    
```

とすると、xが横２列のデータフレームになり、２列目には後ろ側(tabelog.comを含むほう）のリンクが入るはずです。

＝＝  
質問の下記のコードは、'tabelog'という列名がついた列のデータだけを書きだすように指定されています。

```

    df.to_csv('output.csv', columns=['tabelog'])
    
```

ところが、質問に書かれたexcelのファイルは、１行目(列名のリストが書かれているはずの位置)に'tabelog'という列名が有るように見えません。Excelファイルの１行目に'tabelog'という列名が無ければ、read_csvで読み込んだデータフレームにも'tabelog'という列名はありません。  
「分割自体はできてると思うのですが、出力ができません。」というのは、「読み込んだCSVファイルに'tabelog'という列名が無いので、'tabelog'という列名を指定したら出力するものが無かったです」という事ではないでしょうか。

＝＝  
＜改善案＞  
１）  
Excelファイル(csvファイル)の１行目に  
「'mae'  
'tabelog'」  
のように、リンクを区切っているのと同じ文字列で区切った列名を書く。

２）

```

    x = pd.read_csv('output.csv',sep="\n")
    
```

のように、正しい区切り文字を指定して、Excelファイル(csvファイル)を読み込む。

ーー余計な一言ーー  
"Excelファイル”というと、.xlsとか.xlsxとかの拡張子が付いたファイルが想像されます。  
CSVファイルはテキストファイルの一種なので、CSVファイルをExcelファイルと呼ぶのは避けたほうが良いと思います（誤解を生みかねないので）
CC BY-SA 4.0
2019-04-23T09:59:51.017
54429
2019-04-23T10:08:07.460
2019-04-23T10:08:07.460
217
217
54418
answer
確認してみましたところ、質問にあるような１つのセルに複数行の文字列が書かれEXCELシートをCSVとして吐き出すと

```

    "https://www.leafkyoto.net/special/parfait/
    https://tabelog.com/kyoto/A2601/A260503/26001772/"
    "https://www.leafkyoto.net/special/parfait/
    https://tabelog.com/kyoto/A2601/A260503/26018731/"
    "https://www.leafkyoto.net/special/parfait/
    https://tabelog.com/kyoto/A2601/A260202/26032128/"
    
```

のようなCSVファイル出力されているようです。  
ですので、その列に対して

```

    df['URL'].apply(lambda s: pd.Series(s.split()))
    
```

のように `Series.apply()` を行い、その中で `str.split()` した結果を **Series化**
することで、各URLを行に展開できるかと思います。

以下は動作サンプルとなります（HEADER行がある前提です）

```

    import pandas as pd
    import io
    
    data = """
    URL
    "https://www.leafkyoto.net/special/parfait/
    https://tabelog.com/kyoto/A2601/A260503/26001772/"
    "https://www.leafkyoto.net/special/parfait/
    https://tabelog.com/kyoto/A2601/A260503/26018731/"
    "https://www.leafkyoto.net/special/parfait/
    https://tabelog.com/kyoto/A2601/A260202/26032128/"
    """
    
    df = pd.read_csv(io.StringIO(data))
    new_df = df['URL'].apply(lambda s: pd.Series(s.split()))
    #                                            0                                                  1
    #0  https://www.leafkyoto.net/special/parfait/  https://tabelog.com/kyoto/A2601/A260503/26001772/
    #1  https://www.leafkyoto.net/special/parfait/  https://tabelog.com/kyoto/A2601/A260503/26018731/
    #2  https://www.leafkyoto.net/special/parfait/  https://tabelog.com/kyoto/A2601/A260202/26032128/
    
```

あとは必用に応じてカラム名を変えたり、２つ目の列のみを抜き出したり、元のDataFrameと結合したりすると良いでしょう。
CC BY-SA 4.0
2019-04-26T00:55:57.723
54485
2019-04-26T01:09:49.407
2019-04-26T01:09:49.407
24801
24801
54418
answer