質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1440閲覧

AttributeError: 'DataFrame' object has no attribute '必要人数' のエラーを解決したい

KT21

総合スコア1

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/01/18 06:23

実現したいこと

エラーを解決し、コードを完成させてシフト最適化を実行したい。

発生している問題・エラーメッセージ

AttributeError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_12052\2324368433.py in <module>
21 従業員11\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t\t\t○\t○\t○\t○""")).T
22 a,a.columns = a.iloc[1:],a.iloc[0].tolist()
---> 23 a.必要人数 = a.必要人数.astype(int)
24 a.iloc[:,2:] = ~a.iloc[:,2:].isnull()
25 a.insert(0, '日付', a.index.str[0])

~\anaconda3\envs\Python_ex\lib\site-packages\pandas\core\generic.py in getattr(self, name)
5485 ):
5486 return self[name]
-> 5487 return object.getattribute(self, name)
5488
5489 def setattr(self, name: str, value) -> None:

AttributeError: 'DataFrame' object has no attribute '必要人数'

該当のソースコード

import numpy as np, pandas as pd
from pulp import *
from ortoolpy import addvars, addbinvars
from io import StringIO

a = pd.read_table(StringIO("""
日付\t21\t21\t22\t22\t23\t23\t24\t24\t25\t25\t26\t26\t27\t27\t28\t28\t29\t29\t30\t30\t31\t31\t1\t1\t2\t2\t3\t3\t4\t4\t5\t5\t6\t6\t7\t7\t8\t8\t9\t9\t10\t10\t11\t11\t12\t12\t13\t13\t14\t14\t15\t15\t16\t16\t17\t17\t18\t18\t19\t19\t20\t20
時間帯\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C
必要人数\t2\t5\t3\t7\t3\t7\t2\t5\t2\t5\t2\t5\t2\t5\t2\t5\t3\t7\t3\t7\t2\t5\t2\t5\t2\t5\t2\t5\t2\t5\t3\t7\t3\t7\t2\t5\t2\t5\t2\t6\t3\t6\t3\t6\t3\t7\t3\t7\t2\t5\t2\t5\t2\t5\t2\t5\t2\t5\t3\t7\t3\t7
従業員0\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○
従業員1\t\t\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○
従業員2\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○
従業員3\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○
従業員4\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○
従業員5\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○
従業員6\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○
従業員7\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○
従業員8\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○
従業員9\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○
従業員10\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○
従業員11\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t\t\t○\t○\t○\t○""")).T
a,a.columns = a.iloc[1:],a.iloc[0].tolist()
a.必要人数 = a.必要人数.astype(int)
a.iloc[:,2:] = ~a.iloc[:,2:].isnull()
a.insert(0, '日付', a.index.str[0])
a.reset_index(drop=True, inplace=True)
a = a.iloc[:,list(range(3,a.shape[1]))+[0,1,2]]

試したこと

検索して例を探しましたが、見つけられませんでした。
csvから読み込んだ場合も同様のエラーが出てしまいます。
元々がインターネット上で見つけたコードであり、私自身もほぼ初心者の状態でpythonを扱っているため、サポートいただけたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pig_vba

2023/01/18 06:37

エラー自体は[dataframe型変数にそんなメソッドねえよ]って意味です。 中身見てないですが、dataframe型であるならばa.必要人数ではなくa['必要人数']ではないですか?
melian

2023/01/18 06:37

read_table でインデックスカラムを指定するとよいかと思います。 a = pd.read_table(StringIO(""" ... """), index_col=[0]).T そうすれば、 a,a.columns = a.iloc[1:],a.iloc[0].tolist() が不要になります。
KT21

2023/01/18 12:54

pig_vba様 コメントありがとうございます。 []つけてみましたが、KeyErrorとなってしまいます。 どうして認識されないのかわかりません、
KT21

2023/01/18 12:57

melian様 , index_col= [0]を足した場合、今度は IndexError: list index out of range となってしまいました。 列がずれたことで指定する場所を変えれば良いのでしょうか?
melian

2023/01/18 13:00

回答したコードを参照してみて下さい。
guest

回答2

0

ベストアンサー

コメントにも書きましたが、データフレームを転置(transpose)していますので read_table()index_col=[0] を追加して、「日付」カラムをインデックスにしておきます。(直後に reset_index() で元に戻しますけれども)

python

1import numpy as np, pandas as pd 2from io import StringIO 3 4a = pd.read_table(StringIO(""" 5日付\t21\t21\t22\t22\t23\t23\t24\t24\t25\t25\t26\t26\t27\t27\t28\t28\t29\t29\t30\t30\t31\t31\t1\t1\t2\t2\t3\t3\t4\t4\t5\t5\t6\t6\t7\t7\t8\t8\t9\t9\t10\t10\t11\t11\t12\t12\t13\t13\t14\t14\t15\t15\t16\t16\t17\t17\t18\t18\t19\t19\t20\t20 6時間帯\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C\t8D17D\t12C21C 7必要人数\t2\t5\t3\t7\t3\t7\t2\t5\t2\t5\t2\t5\t2\t5\t2\t5\t3\t7\t3\t7\t2\t5\t2\t5\t2\t5\t2\t5\t2\t5\t3\t7\t3\t7\t2\t5\t2\t5\t2\t6\t3\t6\t3\t6\t3\t7\t3\t7\t2\t5\t2\t5\t2\t5\t2\t5\t2\t5\t3\t7\t3\t7 8従業員0\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○ 9従業員1\t\t\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○ 10従業員2\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○ 11従業員3\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○ 12従業員4\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○ 13従業員5\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○ 14従業員6\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○ 15従業員7\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○ 16従業員8\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○ 17従業員9\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○ 18従業員10\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○ 19従業員11\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t\t\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t○\t\t\t○\t○\t\t\t○\t○\t○\t○"""), 20 index_col=[0]).T 21 22a = a.rename_axis(a.columns.name).reset_index() 23a.必要人数 = a.必要人数.astype(int) 24a['日付'] = a['日付'].str[0] 25a[a.columns[3:]] = a[a.columns[3:]].notna() 26a = a[[*a.columns[3:], *a.columns[:3]]] 27print(a.head(10))
従業員0従業員1従業員2従業員3従業員4従業員5従業員6従業員7従業員8従業員9従業員10従業員11日付時間帯必要人数
TrueFalseTrueTrueTrueTrueTrueTrueTrueTrueTrueTrue28D17D2
TrueFalseTrueTrueTrueTrueTrueTrueTrueTrueTrueTrue212C21C5
TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrue28D17D3
TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrue212C21C7
TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrue28D17D3
TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrue212C21C7
TrueFalseTrueTrueTrueTrueTrueTrueTrueTrueFalseTrue28D17D2
TrueFalseTrueTrueTrueTrueTrueTrueTrueTrueFalseTrue212C21C5
TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueFalse28D17D2
TrueTrueTrueTrueTrueTrueTrueTrueTrueTrueTrueFalse212C21C5

投稿2023/01/18 09:56

melian

総合スコア21118

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KT21

2023/01/18 13:02

解答ありがとうございます。エラーは解消されました。日付の部分がすべて[2]になってしまうのは解消可能ですか?
melian

2023/01/18 13:06

元のコードに、 a.insert(0, '日付', a.index.str[0]) という処理がありました。これは日付文字列を最初の1文字で置き換えるという処理だと思うのですが、これをしない場合は、以下の行をコメントアウトして下さい。 # a['日付'] = a['日付'].str[0]
KT21

2023/01/18 13:20

ご丁寧にありがとうございます。 無事元の形に戻すことができました。 ベストアンサーに選ばせていただきます。 このほかにもお聞きしたいことがあるのですが、何かコンタクトを取らせていただくことは可能でしょうか?
melian

2023/01/18 13:25

はい、構いません。
KT21

2023/01/18 13:36

ありがとうございます。 どのようにしてコンタクト取らせていただいたらよいでしょうか。
melian

2023/01/18 13:40

このコメント欄でもよいですし、新たに質問を立てて、そちらのコメント欄でも構いません。
KT21

2023/01/18 13:57

ではこちらで失礼致します。 https://qiita.com/SaitoTsutomu/items/a33aba1a95828eb6bd3f こちらのサイトを参照して組み合わせ最適化のシフトスケジューリング問題を解決しようとしているのですが、良い条件の組み合わせ方がわかりません。 私がつけたい条件は、①0,1,2から1人、2,3,4,5から1人、6,7,8,9から1人、1,10,11から1人は必ず毎日8D17Dあるいは12C21Cで出勤をすること。②Falseとなっているところで出勤としないこと。③勤務回数はできるだけ等しくすること。の3点です。 これらをread_tableから読み込んだデータで実行するコードに関して、ヒントでもかまいませんのでヘルプをお願いしたいです。 大変厚かましいお願いであることは重々承知ですが、何卒お願い致します。
guest

0

a.必要人数 = a.必要人数.astype(int)

pythonのコードに、日本語は記述できません
エラーメッセージもそんなこと言ってますね

投稿2023/01/18 07:15

y_waiwai

総合スコア88163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2023/01/18 08:38

Pandas の場合、 a.必要人数 = a.必要人数.astype(int) と記述してもエラーにはなりません。問題は別の部分にあるのです(カラム名の付け間違い)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問