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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

Q&A

解決済

2回答

2281閲覧

pandasで、1つのセルに複数データを列挙する

0120828828

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

0グッド

0クリップ

投稿2022/03/22 11:59

編集2022/03/22 12:59

最終目標: 1つのセルにデータを列挙する

現在私はPython, pandasを用いて複数のデータフレームの情報を1つにまとめるべく作業を行っています。その途中で行き詰ってしまったので質問させていただきます。

dt1; 個人データ表 dt2; クラスごとのデータ表

dt1イメージ↓
|名前|所属|点数|
|山田|A|80|
|佐藤|A|70|
|伊藤|A|75|
|高橋|B|90|
|大森|B|50|

dt2イメージ↓
|所属|学年|
|A|2|
|B|3|

現状こういったデータが手元にあります。これにコードを書き加えてdt2を以下のような状態にしたいと思っています。

dt2最終イメージ↓
|所属|学年|優秀者|
|A|2|山田, 伊藤|
|B|3|高橋, 大森|

こういったイメージです。所属から名前を抽出して、点数の高い2人を1つのセルに表記したいです。
この際にはどのような書き方をすればよいのでしょうか。自分で調べて試しては見たのですが、次元が合っていないというエラーコードがでました。助言等ございましたらよろしくお願いします。

import requests import pandas as pd dt=pd.read_csv('list.csv',index_col='Name') dt2 = pd.read_csv('class.csv', index_col='Class') Class = dt['Class'] dt2['Name']=(dt[(['Class']=='') & (dt['Point'] > 75)]) NameList = dt2['Name'].values.tolist print(NameList)

上記のように記載したところ、
Expected a 1D array, got an array with shape (2, 2) というエラーが表記されました。

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

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

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

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

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

meg_

2022/03/22 12:12

> 自分で調べて試しては見たのですが、次元が合っていないというエラーコードがでました。 どんなコードですか?
0120828828

2022/03/22 12:22

ご連絡ありがとうございます。 いくつか試している中で表示されたのは、 Expected 2D array, got 1D array instead や、 Expected a 1D array, got an array with shape といったエラーコードです。これの解決策等分かったりしますか??
meg_

2022/03/22 12:24

Pythonのコードがないと分かりません。質問にコードを追記しましょう。
0120828828

2022/03/22 12:48

すみません、以前とエラーコードが変わってしまいましたが以下の通りです。今回は75点以上の人をピックアップしようと思ってコードを書きました。 import requests import pandas as pd dt=pd.read_csv('list.csv',index_col='Name') dt2 = pd.read_csv('class.csv', index_col='Class') Class = dt['Class'] dt2['Name']=(dt[(['Class']=='') & (dt['Point'] > 75)]) NameList = dt2['Name'].values.tolist print(NameList) とすると、 Expected a 1D array, got an array with shape (2, 2)となりました。list型に変換することで対応できるのではないかと思ったのですが、上手くいきませんでした。
meg_

2022/03/22 12:55

質問は編集できますのでコードは質問に追記しましょう。(コードはマークダウンで記入すると見やすくなります)
guest

回答2

0

自己解決

import pandas as pd import io pd.set_option('display.unicode.east_asian_width', True) dt1_csv = ''' 名前,所属,点数 山田,A,80 佐藤,A,70 伊藤,A,75 高橋,B,90 大森,B,50 ''' dt1 = pd.read_csv(io.StringIO(dt1_csv)) dt2_csv = ''' 所属,学年 A,2 B,3 ''' dt2 = pd.read_csv(io.StringIO(dt2_csv)) # dt2 = ( pd.concat([ dt2.set_index('所属'), dt1.groupby('所属') .apply(lambda x: ','.join(x.nlargest(2, '点数')['名前'])) .to_frame('優秀者')], axis=1) .reset_index()) print(dt2) # 所属 学年 優秀者 0 A 2 山田,伊藤 1 B 3 高橋,大森

投稿2022/03/22 13:34

0120828828

総合スコア8

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

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

0

python

1import pandas as pd 2import io 3 4pd.set_option('display.unicode.east_asian_width', True) 5 6dt1_csv = ''' 7名前,所属,点数 8山田,A,80 9佐藤,A,70 10伊藤,A,75 11高橋,B,90 12大森,B,50 13''' 14dt1 = pd.read_csv(io.StringIO(dt1_csv)) 15 16dt2_csv = ''' 17所属,学年 18A,2 19B,3 20''' 21dt2 = pd.read_csv(io.StringIO(dt2_csv)) 22 23# 24dt2 = ( 25 pd.concat([ 26 dt2.set_index('所属'), 27 dt1.groupby('所属') 28 .apply(lambda x: ','.join(x.nlargest(2, '点数')['名前'])) 29 .to_frame('優秀者')], axis=1) 30 .reset_index()) 31 32print(dt2) 33 34# 35 所属 学年 優秀者 360 A 2 山田,伊藤 371 B 3 高橋,大森

投稿2022/03/22 12:59

melian

総合スコア21225

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

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

0120828828

2022/03/22 13:12

ご回答ありがとうございます。記載いただいたコードを実行すると確かに理想通りの表記となりました。しかしこのコードのソース部分をpd.read_csv に置き換えると、initial_value must be str or None, not DataFrame といったエラーが出てしまいました。これはどういうことか分かりますか???
melian

2022/03/22 13:17

追記された部分を見たのですが、 dt=pd.read_csv('list.csv',index_col='Name') dt2 = pd.read_csv('class.csv', index_col='Class') としているので dt と dt2 の構成やカラム名が違っているのではないでしょうか。
0120828828

2022/03/22 13:21

import pandas as pd import io pd.set_option('display.unicode.east_asian_width', True) dt1_csv = pd.read_csv('list.csv',index_col='Name') dt1 =io.StringIO(dt1_csv) print(dt1) としたときに、先ほどのエラーがでてしまいました。 print(dt1_csv)で表記はできているので、このio.StringIO というところがエラーが出ているのかなと思います。 正直この関数が初めて見たので分からないところなのですが、何かわかりますか??
melian

2022/03/22 13:25 編集

ああ、それはエラーになります。 dt1 = pd.read_csv('list.csv',index_col='Name') dt2 = pd.read_csv('class.csv', index_col='Class') だけでよいです。ただし、index_col を指定しているのとカラム名が違っているので私の回答をそのまま実行するとエラーになります。
0120828828

2022/03/22 13:33

迅速なご回答ありがとうございます。無事に表記されました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問