89331


### やりたいこと

Pythonでエクセルの中にある行数をランダムで１行のみ選んで読み込みたいです。

`random.choices()` を使ってやってみましたが、下記のコードだとこちらlenエラーが表示されます。  
lenは使えないと表示されます。  
エクセルの複数行の中からランダムで1行のみ選択可能でしょうか。  
もし分かる方がいましたら、教えていただけると幸いです。

**エラー内容**

[code]

    TypeError: object of type 'generator' has no len()
    
[/code]

エクセルのデータ

[code]

    content,photo1,photo2,photo3,photo4
    test1,1_1.jpg,1-2.jpg,1-3.jpg,1-4.jpg
    test2,2-1.jpg,2-2.jpg,2-3.jpg,2-4.jpg
    test3,3-1.jpg,3-2.jpg,3-3.jpg,3-4.jpg
    
[/code]

### 実現したい結果

エクセルの行数からランダムで１行のみ選択したいです。

例

[code]

    test2,2-1.jpg,2-2.jpg,2-3.jpg,2-4.jpg
    
[/code]

コード

[code]

    import pandas as pd
    import random
    
    excel = r'test.xlsx'
    
    #エクセル読み込み
    df = pd.read_excel(excel,dtype=str)
    
    #ランダムで1行のみ読み込み
    for index, row in random.choices(df.iterrows()):
    
     file_names=[row.photo1,
     row.photo2,
     row.photo3,
     row.photo4
     ]
     
     #photo1からphoto4のリスト出力
     print(file_names)
    
     #content出力
     print(row.content)
    
[/code]

お手数ですが、よろしくお願い致します。


CC BY-SA 4.0
2022-06-11T03:49:54.670
89327
2022-06-11T07:21:30.300
2022-06-11T06:26:52.310
3060
18859
question
python python3
Pythonでエクセルの行をランダムに読み込む方法 TypeError len()


[pandas.DataFrame.sample](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sample.html)を使えば`import
random`が不要になって、

> Return a random sample of items from an axis of object.

この行を：

[code]

    for index, row in random.choices(df.iterrows()):
    
[/code]

このように変更すれば良いでしょう。

[code]

    for index, row in df.sample().iterrows():
    
[/code]


CC BY-SA 4.0
2022-06-11T07:03:10.313
89331
2022-06-11T07:03:10.313
26370
89327
answer

[code]

    import pandas as pd
    import io
    
    csv_data = '''
    content,photo1,photo2,photo3,photo4
    test1,1_1.jpg,1-2.jpg,1-3.jpg,1-4.jpg
    test2,2-1.jpg,2-2.jpg,2-3.jpg,2-4.jpg
    test3,3-1.jpg,3-2.jpg,3-3.jpg,3-4.jpg
    '''
    df = pd.read_csv(io.StringIO(csv_data))
    
    #
    row = df.sample(n=1)
    file_names = row.values[0,1:].tolist()
    
    print(file_names)
    print(row['content'].values[0])
    
[/code]


CC BY-SA 4.0
2022-06-11T07:21:30.300
89332
2022-06-11T07:21:30.300
47127
89327
answer