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

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

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

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

Python

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

Q&A

解決済

1回答

2051閲覧

データテーブル内のリスト/タプルのうち、一番始めと一番最後のデータを抽出する

shu_magi

総合スコア19

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2019/02/22 07:43

編集2019/02/26 05:04

【追記しています】
実際に用いるデータテーブルで実行した場合、要素抽出でなく、リストの最初と最後の文字(今回の場合、括弧())が抽出されてしまいました。この投稿の最後に、詳細を追記します。

簡単な質問かもしれませんが、わからなかったため質問させてください。

前提・実現したいこと

あるデータテーブルについて、テーブル内のある列にリスト、もしくはタプルでデータを保持しています。

IDDatastartend
1(1,2,3,4,5)
2(1,1,2,2,2)
3(1,3,3,3,3,3,3,3,3,3,1,1,1,1,4,5)
4(2,3)
5(1,1,5)
6(2,3,4)

このData列のリスト、タプルの最初と最後のデータを取り出したいと考えています。
以下抽出後のイメージです。

IDDatastartend
1(1,2,3,4,5)15
2(1,1,2,2,2)12
3(1,3,3,3,3,3,3,3,3,3,1,1,1,1,4,5)15
4(2,3)23
5(1,1,5)15
6(2,3,4)24

単純なリスト、タプルからのデータ取り出しは、
tuple[0]
tuple[-1]
等の指定を行えばいいことは理解しています。

宜しくお願い致します。

【以下、追記部分】
canさんのプログラムを応用し、下記dataについて、最初と最後のデータを抽出しようとしましたが、うまくいきませんでした。

python_can_san

1import pandas as pd 2 3df = pd.DataFrame({'Data':[(1,2,3),(4,5)]}) 4df['start'] = df['Data'].apply(lambda x: x[0]) 5df['end'] = df['Data'].apply(lambda x: x[-1]) 6print(df)

処理前

IDDatastartend
1(1_1, 1_2, 1_3, 1_4)
2(1_1, 1_2, 1_3)
3(2_1, 1_2)
4(1_1, 1_2, 1_3)
5(1_1, 1_2)
6(2_1, 1_2)

以下の応用版では、リストの括弧が抜き出されてしまいます。
(データ自体をリストとして保管できていない??)

python_ouyouban

1import pandas as pd 2 3#csv読み込み 4#csv作成前 5df = pd.read_csv("trace_table_test.csv", header=0,) 6df['first_area'] = df['all_area'].apply(lambda x: x[0]) 7df['last_area'] = df['all_area'].apply(lambda x: x[-1]) 8print(df)
IDDatastartend
1(1_1, 1_2, 1_3, 1_4)()
2(1_1, 1_2, 1_3)()
3(2_1, 1_2)()
4(1_1, 1_2, 1_3)()
5(1_1, 1_2)()
6(2_1, 1_2)()

列指定の問題と考え、lambdaの後の値を書き換えましたが、次の文字・数値が抜き出されてしまうようです。

IDDatastartend
1(1_1, 1_2, 1_3, 1_4)14
2(1_1, 1_2, 1_3)13
3(2_1, 1_2)22
4(1_1, 1_2, 1_3)13
5(1_1, 1_2)12
6(2_1, 1_2)22

テストデータをExcelで作成、csv保存していることが問題かもしれません。。
コメントいただけると助かります。

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

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

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

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

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

hayataka2049

2019/02/22 07:52

テーブルそのものは実際には何型のオブジェクトで表現していますか?
shu_magi

2019/02/26 04:45

hayataka2049さん 返信が遅くなり、失礼しました。 ID列はinteger、Data列にはstringのリスト、もしくはDatetimeのリストを入れる想定でいます。
guest

回答1

0

ベストアンサー

.applyで行毎に先頭or末尾を返せばよいです。

Python

1import pandas as pd 2 3df = pd.DataFrame({'Data':[(1,2,3),(4,5)]}) 4df['start'] = df['Data'].apply(lambda x: x[0]) 5df['end'] = df['Data'].apply(lambda x: x[-1]) 6print(df) 7""" 8 Data start end 90 (1, 2, 3) 1 3 101 (4, 5) 4 5 11"""

投稿2019/02/22 07:54

can110

総合スコア38233

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

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

shu_magi

2019/02/25 07:53

canさん ご回答ありがとうございます! これから、頂いた内容で試してみます!
shu_magi

2019/02/26 04:48

canさん 上記、実際に使う際にはdata列に、stringのリスト、もしくはDatetimeのリストを用いようと考えています。 上記プログラムを実行した場合、1つの要素が抜かれず、最初と最後の1文字のみが抜かれてしまい、思ったような動作になりません。。 追記致しますが、対応方法を教えて頂けますでしょうか? データ抜き出しのプログラム側というより、データ側の型指定や持ち方の問題なのでしょうか。
can110

2019/02/26 09:15

data列に入っているのはstringのリストではなく「(1_1, 1_2, 1_3)」のような文字列ではないでしょうか? また、この場合、start,endとして取り出したいのは「1_1」と「1_3」でしょうか?
shu_magi

2019/02/27 04:12

canさん 文字列です。 また、取り出したいのは1_1と1_3です。 別途「("1_1", "1_2", "1_3")」の形にして実施したところ、無事ご教授頂いたプログラムで出来ました!ありがとうございました。 ちなみに、もしお力頂けたら、こちらも見ていただけると大変助かります。。 定義範囲内にデータが有る場合、別データフレームのある値を返す (https://teratail.com/questions/175720) このようなやり方が規約違反の場合はご指摘いただけると助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問