83033


pandasのデータフレーム`df`に１行ずつデータを追加しながら、その１行の行名を指定（変更）したいと思っています。変更しなくてもよい行もあるので、実際のソースでは、`df.rename`を`if`でくくっています。ソースコードのイメージは、以下の通りです。

[code]

    for i in range(0, 100):
        df = df.append(dict(zip(list_colname, list_data)), ignore_index=True)
        if 名前を変える？
            df = df.rename(index={int(len(df)) - 1: 'test' + str(len(df))})
    
[/code]

ただし、

  * `list_colname` : 列名のリスト
  * `list_data` : `list_colname`に対応した、データのリスト

という感じのことをやりたいと思っています。実行した結果を見ると、`df`の末尾の行のみ、意図したとおりの行名（`'test' +
str(len(df))`）に変更されていますが、それ以前の行は連番になっています。

データフレームの上書きというかデータフレームの更新というか（`append`をやる都度、前回までのデータが消えてしまっている？）、そういうのが何かうまくっていない気がします。どういうソースを書いたらよいでしょうか？

よろしくお願いいたします。


CC BY-SA 4.0
2021-10-12T04:41:35.347
83026
2021-10-12T06:09:44.207
2021-10-12T05:23:08.593
43025
43160
question
python pandas
pandasのデータフレームにappendしながら、追加した行の名前を変えたい


dictで追加するのではなく pandas.Series で追加すると良いでしょう

[code]

    df = pd.DataFrame()
    for i in range(10):
        ser = pd.Series([100, 200, 300],
            index=['aaa', 'bbb', 'ccc'],
            name=f'id_{i}' if i %3 == 0 else i*2)
        df = df.append(ser)
    
    display(df)
    
[/code]

というより, 1行ずつ DataFrameにデータを追加というのは遅くなるので, できれば止めたほうがよいような  
(dict や list で管理したほうがよさそう)


CC BY-SA 4.0
2021-10-12T05:44:11.077
83032
2021-10-12T05:44:11.077
43025
83026
answer


行を挿入する前に index の名前を変更しておく方法も考えられます。以下の例では `a` 列の値が偶数の場合に index の名前を変更しています。

[code]

    import pandas as pd
    
    list_colname = ('a', 'b', 'c')
    list_data = (
      (1, 2, 3), (4, 5, 6), (7, 8, 9),
      (10, 11, 12), (13, 14, 15), (16, 17, 18),
    )
    
    df = pd.DataFrame(columns=list_colname)
    for data in list_data:
      df.loc[('' if data[0] % 2 else 'test') + str(len(df))] = data
    
[/code]

###### `print(df.to_markdown())`

| a | b | c  
---|---|---|---  
0 | 1 | 2 | 3  
test1 | 4 | 5 | 6  
2 | 7 | 8 | 9  
test3 | 10 | 11 | 12  
4 | 13 | 14 | 15  
test5 | 16 | 17 | 18


CC BY-SA 4.0
2021-10-12T06:09:44.207
83033
2021-10-12T06:09:44.207
47127
83026
answer