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

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

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

D言語(D programming language)は、プログラミング言語の1つで C言語の後続を目指したマルチパラダイムプログラミング言語で、オブジェクト指向プログラミング可能な言語です。

Python

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

Q&A

解決済

2回答

364閲覧

カラムの中の要素ごとに条件を当てはめられるか

Pablito

総合スコア71

D

D言語(D programming language)は、プログラミング言語の1つで C言語の後続を目指したマルチパラダイムプログラミング言語で、オブジェクト指向プログラミング可能な言語です。

Python

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

0グッド

0クリップ

投稿2019/08/19 07:59

編集2019/08/20 00:21

#やりたいこと
顧客データと購買データを使って、
データ加工の練習をしています。
そこでdefで関数を作る中で
色々条件を設定したいのですが、
一つ疑問があります。

##疑問
deta frameのカラムの一つであるIDごとに
条件を設定できるか

###具体的に言うと
dsというdataframeを作りました。
内容は

 cst_id yymm_entry Main_store_code KaiinType KaiinStatus Gold_Kaiin DMFlag_c MailFlag_c ...
0 3147023052075 201711 3001.0 Web会員 登録済 通常会員 DM拒否 メール可 ...
1 3147023052075 201711 3001.0 Web会員 登録済 通常会員 DM拒否 メール可 ...
みたいな感じです。

この中にSt_SalesChannelというのがあり、アウトレット店、百貨店、路面店などがあります。

ここで、
pandas-plyの要領で、
from pandas_ply import install_oly, X, sym_call
install_ply(pd)

def add_flag3(data_input):
if ds_inout.St_SalesChannel == '路面店':
output = 1 if df_input.cst_id........
みたいな感じで書きたいのですが、
設定したい条件が
「同じIDで最初の行のChannelが路面店、
そして二回目以降の購入(同一IDの行で2行目以降)、
かつ路面店での購入」というものです。
少し複雑なのですが、
こういう条件を if と elseの組み合わせで
実現できるのでしょうか???

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

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

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

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

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

guest

回答2

0

ベストアンサー

python

1def add_flag3(data_input): 2 df = data_input[data.duplicated()] 3 df = data_input[data_input[["id"] == df["id"]] 4 5 count = df['St_SalesChannel'].value_counts()["路面店"] 6 7 if count > 1: 8 return df 9

多分こうだと思います

投稿2019/08/19 22:17

編集2019/08/19 22:18
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Pablito

2019/08/20 00:33

ご回答ありがとうございます。 from pandas_ply import install_ply, X, sym_call install_ply(pd) def add_flag3(ds_input): df = ds_input[ds.duplicated()] df = ds_input[ds_input[['cst_id'] == ds['cst_id']]] count = df['St_SalesChannel'].value_counts()['路面店'] if count > 1: return ds ds.ix[ : , 'flag3'] = ds.apply(add_flag3, axis=1) 頂いたアドバイスを参考にこのように書いてみたのですが、 以下のようなエラーが起きました。 IndexingError: ('Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).', 'occurred at index 0') 理由は分かりますでしょうか???
退会済みユーザー

退会済みユーザー

2019/08/20 04:28

条件に当てはまったものを返しているのでdsの行数が合わずエラーになっているので import numpy as np input_data = add_flag3() ds["flag3"] = np.nan for i in list(input_data.index): df.loc[i] = input_data[i] こうすればできると思います
Pablito

2019/08/20 07:11

ありがとうございます!
guest

0

良く伝わらないのですがこんな感じでしょうかね。
最終行のprint文で「1回目のChannelが路面店で、なおかつ2回目以降に1度でもChannelが路面店の人」のcst_idを出力しています。
適宜改変してください。

python

1true_customer_list = [] 2for one_cst_data in all_cst_data: 3 first_flag = false 4 for one_purchase_data in all_purchase_data: 5 if one_cst_data.cst_id == one_purchase_data.cst_id: 6 if one_purchase_data.St_SalesChannel == '路面店': 7 if first_flag: 8 true_customer_list.append(one_cst_data.cst_id) 9 break 10 first_flag = true 11 elif not first_flag: 12 break 13print(true_customer_list)

投稿2019/08/19 08:29

編集2019/08/19 08:35
shirai

総合スコア1290

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問