

Pythonでpykakasi・pandasを使ってcsvのファイルの列をカタカナの形式で表示したいです。  
エラーになってしまう為、どのようにすればよいでしょうか。  
バージョンが古いということでしょうか。

### エラーメッセージ

[code]

    DeprecationWarning: Call to deprecated method setMode. (Old API will be removed in v3.0.) -- Deprecated since version 2.1.
      kks.setMode("H", "k")
    Traceback (most recent call last)
    File "C:\Users\test\Desktop\Book.csv", line 29, in <module>
        kks.setMode("H", "k")
    
[/code]

### やりたいこと

下記のCSVファイルの氏名（カタカナ）の列にふりがな・ローマ字が含んでいるため  
全て統一させてフリガナへ変換したいです。  
空白のエクセルは無視します。

csvファイル  
※ダミーの氏名

[code]

    氏名,氏名（カタカナ）
    大野 信二,オオノ シンジ
    千石 美香子,センゴク ミカコ
    Nakajima Tomoyo,ナカジマ トモヨ
    ,
    竹村理代,たけむら りよ
    森永浩子,モリナガ ヒロコ
    矢島 貴史,ヤジマ タカシ
    ??daka?,
    古賀 美幸,Koga Miyuki
    熊倉 健二,クマクラ ケンジ
    
[/code]

### 期待する動作

氏名（カタカナ）の列をカタカナへ変換したいです。

[code]

    氏名,氏名（カタカナ）
    大野 信二,オオノ シンジ
    千石 美香子,センゴク ミカコ
    中嶋 知代,ナカジマ トモヨ
    ,
    竹村 理代,タケムラ リヨ
    森永 浩子,モリナガ ヒロコ
    矢島 貴史,ヤジマ タカシ
    "??daka?,",
    古賀 美幸,コガ ミユキ
    熊倉 健二,クマクラ ケンジ
    
[/code]

全てのコード

[code]

    import pandas as pd
    from pykakasi import kakasi
    
    #ファイル名
    filename1=r"C:\Users\test\Desktop\Book.csv"
    
    #csv読み込みdtype=objectと指定
    df = pd.read_csv(filename1)
    print(df)
    
    #列指定　タイプ確認
    print(df['氏名（カタカナ）'])
    
    kks = kakasi()
    
    #ふりがな→カタカナへ変換
    kks.setMode("H", "k")
    conv = kks.getConverter()
    df['氏名（カタカナ）'] = df['氏名（カタカナ）'].apply(conv.do)
    print(df)
    
    #ローマ字→カタカナへ変換
    kks.setMode("a", "k")
    conv = kks.getConverter()
    df['氏名（カタカナ）'] = df['氏名（カタカナ）'].apply(conv.do)
    print(df)
    
    #csv保存
    df.to_csv(filename1,encoding='utf_8_sig',index=False)
    
[/code]

よろしくおねがいします。


CC BY-SA 4.0
2022-08-28T05:35:58.797
90807
2022-09-01T04:10:47.593
2022-08-28T07:50:42.637
3060
18859
question
python python3 pykakasi
pykakasiを使ってcsvのファイルの列をカタカナへ変換したい


> バージョンが古いということでしょうか。

はい。  
エラーメッセージと公式ドキュメントの[注記](https://pykakasi.readthedocs.io/en/latest/api.html#old-
api-v1-2)の通り、`pykakasi`の`v3.0`以降は`setMode`関数が廃止されました。

代わりに[`convert`](https://pykakasi.readthedocs.io/en/latest/api.html#convert-
method)関数を使用してください。

下記のサンプルコードでは`to_kana`関数で`convert`を呼び出し、形態素のカナ表現を結合して返します。

**サンプルコード**

[jaconv](https://github.com/ikegami-
yukino/jaconv)ライブラリを使ってローマ字をカタカナに直す版に書き換えました。

[code]

    import pandas as pd
    import numpy as np
    from io import StringIO
    from pykakasi import kakasi
    import jaconv
    import re
    
    csv = StringIO("""氏名,氏名（カタカナ）
    大野 信二,オオノ シンジ
    千石 美香子,センゴク ミカコ
    Nakajima Tomoyo,ナカジマ トモヨ
    ,
    竹村理代,たけむら りよ
    森永浩子,モリナガ ヒロコ
    矢島 貴史,ヤジマ タカシ
    "??daka?",
    古賀 美幸,Koga Miyuki
    熊倉 健二,クマクラ ケンジ
    途中がアルファベット,ほげfuがPIよ
    英語1,Hello QWERTY!
    英語2,The quick brown fox jumps over the lazy dog.
    記号,!?\"#$%&'()[]{}@:`*<>.！”＃＄％＆’（）＠：［］｛｝
    """)
    df = pd.read_csv(csv)
    
    kks = kakasi()
    pattern = re.compile("[A-Za-z]")
    def to_kana(s):
        if pd.isna(s):
            return np.nan
        #アルファベットがある場合は置換しておく
        if pattern.search(s):
            s = jaconv.alphabet2kata(s.lower()) # jaconvが大文字をカナ変換できないので、lowerで小文字に変換した後に置換処理を行う
        results = kks.convert(s)
        return "".join([x["kana"] for x in results])
    
    df['氏名（カタカナ）'] = df['氏名（カタカナ）'].apply(to_kana)
    
    # 要 pip install tabulate
    print(df.to_markdown())
    
[/code]

**出力結果**

| 氏名 | 氏名（カタカナ）  
---|---|---  
0 | 大野 信二 | オオノ シンジ  
1 | 千石 美香子 | センゴク ミカコ  
2 | Nakajima Tomoyo | ナカジマ トモヨ  
3 | nan | nan  
4 | 竹村理代 | タケムラ リヨ  
5 | 森永浩子 | モリナガ ヒロコ  
6 | 矢島 貴史 | ヤジマ タカシ  
7 | ??daka? | nan  
8 | 古賀 美幸 | コガ ミユキ  
9 | 熊倉 健二 | クマクラ ケンジ  
10 | 途中がアルファベット | ホゲフガピヨ  
11 | 英語1 | ヘルロ ッッエッッッ!  
12 | 英語2 | テェ クイッッ ッロッン フォッ ジュンッッ オヴェッ テェ ラッッ ドッ.  
13 | 記号 | !?"#$%&'()[]{}@:`*<>.！”＃＄％＆’（）＠：［］｛｝  
  
* * *

「Koga Miyuki」を`convert`した結果は下記の通りです。

[code]

    [{'orig': 'Koga Miyuki', 'hira': 'Koga Miyuki', 'kana': 'Koga Miyuki', 'hepburn': 'Koga Miyuki', 'kunrei': 'Koga Miyuki', 'passport': 'Koga Miyuki'}]
    
[/code]

ローマ字がカタカナにならないのは回答時点の最新版の仕様のようですので、これをカナに変換するには別のライブラリなどを使用して対策する必要があるように見えます。


CC BY-SA 4.0
2022-08-28T06:29:56.920
90808
2022-09-01T04:10:47.593
2022-09-01T04:10:47.593
9820
9820
90807
answer