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

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

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

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

1284閲覧

Python 3 Pandasでデータフレームにカラムを増やしたい

SnowBallEffect

総合スコア28

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/01/23 02:10

編集2020/01/23 04:43

Pandasでサイトから引き抜いたテーブルがあるのですが、

ColumA | ColumB | ColumC | ColumD | ColumE
Data1 Data2 | Data3 | Data4 | Data5 |Data6

これを以下のように変更したい

Colum A | ColumB | ColumC | ColumD | ColumE | ColumF
Data1 |Data2 | Data3 | Data4 | Data5 |Data6

Python

1import pandas as pd 2 3filename = r"c:\users\someone\desktop\BP-NET.html" 4path = open(filename, 'r') 5 6destination = r"c:\users\someone\desktop\test.xlsx" 7 8#Extracting the 3 tables 9df1 = pd.io.html.read_html(filename, encoding='Shift JIS', attrs= {'class':'list2'})[0] 10df2 = pd.io.html.read_html(filename, encoding='Shift JIS', attrs= {'class':'list2'})[1] 11df3 = pd.io.html.read_html(filename, encoding='Shift JIS', attrs= {'class':'list2'})[2] 12 13#broker names 14df1_broker_name = 'broker1 (12345)' 15df2_broker_name = 'broker2 (23456)' 16df3_broker_name = 'broker3 (34567)' 17 18#Adding the broker names 19df = df1_broker_name + df2_broker_name + df3_broker_name 20 21#Inserting the broker names 22df1.insert(4, '販社名', df1_broker_name) 23df2.insert(4, '販社名', df2_broker_name) 24df3.insert(4, '販社名', df3_broker_name) 25 26#Specifying broker codes 27df1_broker_code = '12345' 28df2_broker_code = '23456' 29df3_broker_code = '34567' 30 31#Adding broker codes 32df = df1_broker_code + df2_broker_code + df3_broker_code 33 34#Inserting the broker codes to column 5 35df1.insert(5, '指定販売会社コード', df1_broker_code) 36df2.insert(5, '指定販売会社コード', df2_broker_code) 37df3.insert(5, '指定販売会社コード', df3_broker_code) 38 39#Adding three dataframes into one 40df = df1 + df2 + df3 41 42#Concatenating the dataframes 43df = pd.concat([df1, df2, df3]) 44 45# 奇数行 46tmp1 = df.iloc[::2].reset_index(drop=True) 47tmp1.columns = df.columns.get_level_values(0) 48 49# 偶数行 50tmp2 = df.iloc[1::2].reset_index(drop=True) 51tmp2.columns = df.columns.get_level_values(1) 52# 結合 53df = pd.concat([tmp1, tmp2], axis=1) 54 55print(df) 56#df.to_excel(destination, sheet_name='Test') 57

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

AttributeError: 'DataFrame' object has no attribute 'str'

試したこと

new = df["No状況"].str.split(" ", n = 1, expand = True)
df["No"]= new[0]
df["状況"]= new[1]
df.drop(columns =["No状況"], inplace = True)

補足情報(Excelにおとすと次のようになります)

補足:

A) 列1の'No状況'は'No'と'状況'として、別々の列に分けたいです。それに伴い、000001から000042と合計が'No'がそこに入り、当日有りと合計が'状況'に入ってほしいです。
B) テーブル1(0行目~21行目)とテーブル3(36行目~46行目)なぜかテーブル2(22行目~35行目)のファンドコードのカラムとファンド名カラムだけが逆になっています。

イメージ説明

ここにより詳細な情報を記載してください。

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

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

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

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

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

magichan

2020/01/23 02:28

データの形式がよくわからないので、最後の print(df) の部分を print(df.head(n=3)) などと書き換えて、出力された結果をすべて質問に書き出す事はできませんでしょうか。(できたらコードブロックのマークダウンを使って書いてください) データで見せたくない部分は適当な値に書き直して頂いても構いません。
SnowBallEffect

2020/01/23 04:44

Magichanさん、エクセルが多き過ぎて画像を添付いたしました。
guest

回答2

0

ベストアンサー

データがないのでよくわかりませんが、「試したとこ」の部分はこんな感じでしょうか。

python

1import pandas 2df = pandas.DataFrame([[f"Aa{i} Ab{i}" ,f"B{i}", f"C{i}"]for i in range(3)], columns=["No状況", "B", "C"]) 3print(df) 4 5new_df = df["No状況"].str.split(' ', expand=True) 6new_df.columns=["No", "状況"] 7print(new_df) 8 9df = pandas.concat([new_df, df], axis=1).drop('No状況', axis=1) 10print(df)

df
No状況 B C
0 Aa0 Ab0 B0 C0
1 Aa1 Ab1 B1 C1
2 Aa2 Ab2 B2 C2

new_df
No 状況
0 Aa0 Ab0
1 Aa1 Ab1
2 Aa2 Ab2

df
No 状況 B C
0 Aa0 Ab0 B0 C0
1 Aa1 Ab1 B1 C1
2 Aa2 Ab2 B2 C2

投稿2020/01/23 04:35

jeanbiego

総合スコア3966

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

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

SnowBallEffect

2020/01/23 08:22

ありがとうございます!データはエクセルの画像を張り付けました。df = pandas.DataFrame([[f"Aa{i} Ab{i}" ,f"B{i}", f"C{i}"]for i in range(3)], columns=["No状況", "B", "C"]) の部分なのですが、引き抜いたデータを元にコードを書くは可能なのでしょうか?それともカルムは全部、手入力ではいけないのでしょうか?
jeanbiego

2020/01/23 08:36

該当部分はテスト用に適当なデータを作っただけですので、使う場合は引き抜いたデータを元にnew_def= ~ から試してみて下さい。
SnowBallEffect

2020/01/24 00:34

すみません、df1 = pd.io.html.read_html(filename, encoding='Shift JIS', attrs= {'class':'list2'})[0] df2 = pd.io.html.read_html(filename, encoding='Shift JIS', attrs= {'class':'list2'})[1] df3 = pd.io.html.read_html(filename, encoding='Shift JIS', attrs= {'class':'list2'})[2] df = df1 + df2 + df3 df = pd.concat([df1, df2, df3]) new_df = df["no状況].str.split(' ', expand = True) new_df.columns = ["No", "状況"] にしたらAttributeError: 'DataFrame' object has no attribute 'str' になります。。。 なんどもすみません。。。
jeanbiego

2020/01/24 01:18

new_df = df["no状況].str.split(' ', expand = True) ここは"No状況"ではないのでしょうか。 あと、 df = df1 + df2 + df3 これは必要ですか?
SnowBallEffect

2020/01/24 01:33

new_df = df["no状況].str.split(' ', expand = True) ここは"No状況"であっています。テーブルが3つあってそれぞれに"NO状況"があります。それを"No"と"状況”に分けたいです。 df = df1 + df2 + df3 は df = pd.concat(df1, df2, df3])があるので、いらないみたいですね。すみません、まだpython始めたばかりでよくわからなくて。。。
jeanbiego

2020/01/24 02:19

あー、そうではなくdf["no状況]になっているので、df["No状況"]が正しいのではないのかと。
SnowBallEffect

2020/01/24 04:34

すいません、df["No状況"]であっていますが、Teratailではdf["no状況]って間違って書きました。df["No状況"]でやってみましたが、それでもAttributeError: 'DataFrame' object has no attribute 'str' って出てきます。。。
jeanbiego

2020/01/24 04:41

もしかしたら、No状況が2列以上存在していませんか。str.splitは1列(series相当)にしか使えません。
SnowBallEffect

2020/01/24 04:54

No状況が2列存在しています!あと、自分で追加したカラムも同じものがもう一つ存在しています。。。どうすれば、一つだけになるのでしょうか??
jeanbiego

2020/01/24 05:02

どの段階から2列あるのか調べてみて下さい。df1,2,3からあるのか、結合したせいで増えてるのか。
SnowBallEffect

2020/01/24 05:23

df1からあります。df2もdf3も別々に走らせたのですが、No状況と私が追加した列が2列になります。。。
jeanbiego

2020/01/24 05:28

では、仮にdf.columns=["No状況", x,x,x,"No状況",x,x]みたいになってるとして、 df.columns=["No状況", x,x,x,"No状況_不要",x,x]とかで要らない方を名前変えてみてはいかがでしょう。
SnowBallEffect

2020/01/24 06:40

すいません、どこからdf.columns=["No状況", x,x,x,"No状況_不要",x,x] と書けばよろしいでしょうか?最後のコードが#tmp2 = df.iloc[1::2].reset_index(drop=True) #tmp2.columns = df.columns.get_level_values(1) なのですが、もうこの時点で2列になっています。。。 何度もすいません。。。
jeanbiego

2020/01/24 07:58

少なくとも、str.splitを使う段階ではNo状況列は1つになっていないと問題があります。 なので、その直前のdfの列名を確認して、不要なものを書き換えて下さい。
SnowBallEffect

2020/01/31 02:15

できました! new = df1_tmp1['No状況'] #splitting df1_tmp1['No'] = new[:0] #splitting df1_tmp1['状況'] = new[:0]
guest

0

pd.concat([tmp1, tmp2], axis=1)の結果、同じ名前の列が複数できているdf['列名']の結果としてSeriesではなくDataFrameが返り、提示エラーが発生します。
そのような場合はilocでインデックスで列を指定することで回避可能です。

Python

1import pandas as pd 2 3tmp1 = pd.DataFrame([['a','b'],['d','d']], columns=['c1','c2']) 4tmp2 = pd.DataFrame([['e','f'],['g','h']], columns=['c2','c3']) 5df = pd.concat([tmp1, tmp2], axis=1) 6print(df) 7# c1 c2 c2 c3 8#0 a b e f 9#1 d d g h 10 11print(df['c1'].str.split(' ')) 12#0 [a] 13#1 [d] 14 15# SeriesではなくDataFrameが返る 16print(df['c2']) 17# c2 c2 18#0 b e 19#1 d g 20 21# print(df['c2'].str.split(' ')) 22# AttributeError: 'DataFrame' object has no attribute 'str' 23 24# 左側の「c2」列を抽出 25print(df.iloc[:,1].str.split(' ')) 26#0 [b] 27#1 [d]

投稿2020/01/23 04:12

can110

総合スコア38260

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問