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

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

ただいまの
回答率

91.23%

  • Python 3.x

    2798questions

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

CSVを抽出、加工の処理がうまくいきません。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 85

James1201

score 2

前提・実現したいこと

twitterのテキスト処理の過程でcsvファイルを加工して出力するのですが、狙った形でのプロットがなかなかうまくいきません。卒論の初稿締め切りが迫っており、ここしか頼るところがありません。どなたか助けていただけませんでしょうか。

入力ファイル(csv)↓

A B C D E F G H I
0 2011/3/11 19:57:54 eiden33 ちょっとイソジンかって放射能対策してくる。 None None None None
1 2011/3/11 20:02:34 BELx2TOKYOJAPAN 外部電源が無いですが電源車で復旧だそうです。放射能漏れは無いとのことだけど柏崎原発の時も隠蔽してたので、納豆,コンブ,イソジン(ヨウ素剤)を用意していおきましょう!ヨウ素の摂取量です。甲状腺に異常のある人はヨウ素取りすぎないようにhttp://www.nuketext.or... None None None None
3501 2011/4/1 11:48:22 shiori_ayase 今日は、イソジン買って帰る。・・・いや、放射線対策じゃなくてね、のどが痛いんだよ、うがい薬が欲しいんだよ!! None None None None
3502 2011/4/2 12:05:15 enjoy_cacao logic_text 陰毛がチリチリして来た気がするのも、やはり放射能の影響でしょうか。イソジントリートメントでケアしなくては…。 None

目標とするcsvファイル↓

A B C D E F G H I
0 2011/3/11 19:57:54 eiden33
1 2011/3/11 20:02:34 BELx2TOKYOJAPAN
3501 2011/4/1 11:48:22 shiori_ayase
3502 2011/4/2 12:05:15 enjoy_cacao logic_text

以上の操作の説明としましては、ツイート情報(1行)から空白やNoneやツイート本文を除いて、かつ、日時とアカウント名だけを取り出して出力のように並べるという動作がしたいです。

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

エラーメッセージ

該当のソースコード

list1=[]
list2=pd.DataFrame(index=[], columns=[])

for i in range(0,1):
    txt = dema_df.loc[i:i,['C','D','E','F','G','H','I']]

    a = txt.iloc[:,[n]]
    while(len(str(a)) <= 15):

            b = re.findall("[a-zA-Z0-9_]{2,15}", str(a))#正規表現
            oo=[]
            for j in range(0,len(b)):

                if (b[j] != 'None'):
                    oo=np.append(oo,b[j])

    list1=pd.DataFrame(oooo)
    list2=pd.concat([list2,list1])
list2

試したこと

ここでは、「正規表現での抽出」は半角表記であるものを抽出する動作なので、アカウント名を抽出しようとすると日時の情報も一緒に抽出されてしまうので一旦切り分けて考えています。
できれば日時情報も一緒に作業過程の中に入ったコーディングをご教授いただけたら幸いです。

上記コードの考え方としましては、
①入力されたcsvファイル(dema_df)を上から1行だけ読み込む。
②まず長文(ツイート内容)を弾くためにlen <= 15 のセルだけを抽出(アカウント名の字数制限は2文字以上15文字以下)。
③正規表現を用いて半角表記のセル(=アカウント名の入ったセル)を取り出す。
④取り出したセルを左から順番に一列に並べる

以下、元のデータフレームの終わりの行まで繰り返し

となります。

(②を行うことでツイート本文中のURLなどの半角表記に③で反応してしまうことを防いでいます。)

目標とするプロットまで、まだまだ至らぬ点がたくさんあるコーディングであるとは思いますが、自力ではこれが限界でした...。何卒よろしくお願いします。

補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2018/01/02 18:14

    とにかく急いで対応するのであれば、ここで回答を待つよりExcelでマウス片手に列を切り貼りした方が手っ取り早いですよ。表のとおりにCSVのデータが並んでいるなら、D列を削除、Noneを削除、云々するだけで対応できそうですが...

    キャンセル

  • James1201

    2018/01/02 18:18

    ありがとうございます。最悪の手段としてそちらの手段も検討してみようと思いますが、このようなファイルがあと何個もあるためできればコーディングで対処したい所存です...。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/01/02 18:25

    取り急ぎ他の人にも注目してもらいやすいように+1しますね。

    キャンセル

  • James1201

    2018/01/02 18:33

    恐縮です、ありがとうございます…!m(_ _)m

    キャンセル

回答 2

checkベストアンサー

+1

焦っている気持ちはわかりますが、
CSVファイルをコピーしやすい状態にする、データのバリエーションについて、などより多くの情報を先に提示することによって、解決に近づくことが楽になります。

アカウント名について、半角から始まることを仮定しました。

import pandas as pd
import numpy as np
import re

from io import StringIO
# CSVファイルがないので、見えているものを手で入れました。
a = StringIO('''A,B,C,D,E,F,G,H,I
0,2011/3/11,19:57:54,eiden33,ちょっとイソジンかって放射能対策してくる。,,None,None,None,None
1,2011/3/11,20:02:34,BELx2TOKYOJAPAN,外部電源が無いですが電源車で復旧だそうです。放射能漏れは無いとのことだけど柏崎原発の時も隠蔽してたので、納豆,コンブ,イソジン(ヨウ素剤)を用意していおきましょう!ヨウ素の摂取量です。甲状腺に異常のある人はヨウ素取りすぎないようにhttp://www.nuketext.or...,,None,None,None,None
3501,2011/4/1,11:48:22,shiori_ayase,今日は、イソジン買って帰る。・・・いや、放射線対策じゃなくてね、のどが痛いんだよ、うがい薬が欲しいんだよ!!,,None,None,None,None
3502,2011/4/2,12:05:15,,enjoy_cacao,logic_text,,陰毛がチリチリして来た気がするのも、やはり放射能の影響でしょうか。イソジントリートメントでケアしなくては…。,,None''')

# read CSV file
df = pd.read_csv(a)
# possible account parts
cols = df.columns[2:]
# fill NaNs
df = df.fillna('')
# get account name with assumption, else fill with ''
df.loc[:, cols] = df[cols].apply(lambda ss: [next(iter(re.findall('^[a-zA-Z0-9_]{2,15}', str(s))), '') or '' for s in ss], axis=1)
# replace 'None' with ''
df = df.replace(to_replace='None', value='')
# replace '' for NaN to drop
df = df.replace(to_replace='', value=np.nan)
# record column names
cols = df.columns
# drop NaNs and shift to left
df = df.apply(lambda x: pd.Series(x.dropna().values), axis=1).fillna('')
# use recored column names
df.columns = cols[:len(df.columns)]
# answer is in df
print(df)

見えている限りdema_df[['A','B','C']]で目的は果たされませんか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/03 00:35

    ご回答ありがとうございます。
    実は抽出したいアカウント名の入ったセルは、行を追っていくとC列より先のD、E列...、にも偏在しておりそれを条件を使って抽出し、配列で表示したいのです...。

    キャンセル

  • 2018/01/03 00:35

    ご回答ありがとうございます。
    実は抽出したいアカウント名の入ったセルは、行を追っていくとC列より先のD、E列...、にも偏在しておりそれを条件を使って抽出し、配列で表示したいのです...。

    キャンセル

  • 2018/01/03 02:03 編集

    D列以降にアカウント名があっても取ってこれるようにしました。
    コードなので、回答に追記しました。

    考え方としては必要なもの以外をNaNを取り除くメソッドdropnaを使って消すことによって左側に欲しいものを持ってきます。
    手元の環境ではNaNに種類があってうまくドロップできなかったので、
    そのためにまず必要のないものをすべて空の文字列''にしてから、''をNaNへ一気に変換して、ドロップしました。

    コード・日本語混合の文字変換が面倒だったので、コメントは短く英語にしました。
    雰囲気で何をしたいのかわからない場合はまたコメント等で質問してください。

    キャンセル

  • 2018/01/03 16:54

    無事に目標となるファイルを作ることができました。
    本当にありがとうございました...!!!

    キャンセル

0

つimport csv

import csv

with open('sample.csv', 'r') as f:
    reader = csv.reader(f)

    for row in reader:
        print(row)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/02 18:39

    ご回答ありがとうございます。
    csv自体の読み込み・1行づつ出力は自力でもできるのですが、1行ずつ読み込んでそれを「細々と加工する」という動作で行き詰まっている次第です…。

    キャンセル

  • 2018/01/02 18:56

    上記のrowはlistで、row[0],row[1],...でカラム毎の値を取得できます。

    キャンセル

  • 2018/01/03 00:59

    そうしますと、取得したrow[0],row[1],...,row[n]を、
    例えば、条件でrow[1],row[2],row[10]の3つに絞れたとして、それらを上記のlist1に格納するという作業をi行繰り返したものを上記のlist2に格納したのち、プロットという形にするにはどうすれば良いのでしょうか...。
    イメージとしては
    list1は抽出したもの(アカウント名)を横に隙間なく1行に並べていく作業で、
    list2でlist1をⅰ回縦に積んでいくというイメージです。
    伝わりにくかったらすみません...!!

    キャンセル

  • 2018/01/03 16:56

    無事解決いたしました、ご協力ありがとうございました!

    キャンセル

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

ただいまの回答率

91.23%

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    2798questions

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