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

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

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

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

pandas

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

Q&A

解決済

2回答

735閲覧

2つのデータフレームを比較と欠損値を特定位置に特定の値で補充したいです。

amaturePy

総合スコア131

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2021/06/01 14:52

編集2021/06/01 15:42

timestamp_dfとpush_start_numという2つのdfがあり、以下の処理が実現できないか試しています。
今のところ、差集合を見つける記事などは見つけたのですが、それを元に以下の同じ内容の処理をしているものを見つけられず、何かアドバイスを頂ければと質問させて頂きました。

やりたいことは以下の通りになります。
①timestamp_df側にはあって、push_start_num側には無い日付をtimestamp_dfと同じ位置でpush_start_num側のインデックスとして取得し、値をnull,0,Noneのどれかにできればと考えております。なので、最終的にはdfBのインデックスの日付はtimestamp_dfと同じになりますが、元々push_start_num側には無いので値をnull,0,Noneとします。
目的
以下2つのdfを最後にconcatでまとめてデータベースで管理するのが目的です。dfBはcount部分をリストに格納し、それを再度df化し数字の部分だけ使います。
そこで2つのdfを繋げた際に、timestamp_df側には存在し、push_start_num側には存在しない日付があり、それぞれのdfの長さが異なっているため、最後に繋げた際にtimestamp_dfの日付に対するpush_start_numの数字にずれが生じているものの辻褄を直すためです。

内容も複雑ですし、私自身の説明もちゃんとお伝えできてるか不安ではありますが、もし何か使えそうなpandasなどのメソッドをご存知の方はいらっしゃいましたらご教授頂けると幸いです。

print(timestamp_df) 0 2021-04-29 1 2021-04-30 2 2021-05-01 3 2021-05-02 4 2021-05-03 .. ... 81 2021-05-29 82 2021-05-30 83 2021-05-31 84 2021-06-01 85 2021-05-21
print(push_start_num) push1_start_date 2021-04-29 3 2021-04-30 20 2021-05-01 24 2021-05-02 21 2021-05-03 14 2021-05-04 5 2021-05-05 14 2021-05-06 16 2021-05-07 17 2021-05-08 14 2021-05-11 78 2021-05-12 20 2021-05-13 13 2021-05-14 8 2021-05-15 18 2021-05-16 16 2021-05-17 16 2021-05-18 18 続く
timestamp_list = [] for c in push_date_df.columns: push_num = push_date_df.groupby(c)[c].count() for x in push_num.index: timestamp_list.append(x) timestamp_df = pd.DataFrame({'timestamp':timestamp_list}) push_start_df = pd.DataFrame() for c in push_start_col:  push_start_df[c] = df[c] push_start_num_list = [] for c in push_start_df.columns: push_start_num = push_start_df.groupby(c)[c].count()    print(push_start_num) for x in push_start_num: push_start_num_list.append(x)

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

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

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

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

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

guest

回答2

0

ベストアンサー

適切に結合すれば勝手に欠損値で補われます。


例:

説明のために行数を減らしています。

push1_start_date

count
2021-05-0717
2021-05-0814
2021-05-1178
2021-05-1220

timestamp_df

date
02021-05-07
12021-05-08
22021-05-09
32021-05-10
42021-05-11
52021-05-12

データフレームが上記の状態の時、

python

1timestamp_df.merge(push1_start_date, how='left', left_on='date', right_index=True) 2# date count 3# 0 2021-05-07 17.0 4# 1 2021-05-08 14.0 5# 2 2021-05-09 NaN 6# 3 2021-05-10 NaN 7# 4 2021-05-11 78.0 8# 5 2021-05-12 20.0 9 10pd.concat([timestamp_df.set_index('date'), push1_start_date], axis=1) 11# count 12# date 13# 2021-05-07 17.0 14# 2021-05-08 14.0 15# 2021-05-09 NaN 16# 2021-05-10 NaN 17# 2021-05-11 78.0 18# 2021-05-12 20.0

参考:
pandas.DataFrameを結合するmerge, join(列・インデックス基準) | note.nkmk.me
pandas.DataFrame, Seriesを連結するconcat | note.nkmk.me
Pandasユーザーガイド「mergeとjoinとconcatenateとcompare」(公式ドキュメント日本語訳) - Qiita

投稿2021/06/02 00:40

kirara0048

総合スコア1399

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

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

amaturePy

2021/06/02 09:23

返信が遅くなり申し訳ございません。 頂いたコードを試させて頂いてるのですが、データ型の違いでmergeできず、そちらの修正をしているところです。ドキュメントの方もありがとうございます。こういう場合にmergeを使うのですね。 .dtypesを見るとtimestamp_dfがobjectでpush1_start_dateがint64なので、そちら解消して頂いたコードの出力を見てみます。
guest

0

元のDataFrameの型とか何がindexなのかが良くわかりませんのでまちがっているかもしれません。
適当に修正してみてください。

python

1>>> print(timestamp_df) 2 date 30 2021-04-29 41 2021-04-30 52 2021-05-01 63 2021-05-02 74 2021-05-03 85 2021-05-29 96 2021-05-30 107 2021-05-31 118 2021-06-01 129 2021-05-21 13>>> print(push_start_num) 14 push1_start_date 152021-04-29 3 162021-04-30 20 172021-05-01 24 182021-05-02 21 192021-05-03 14 202021-05-04 5 212021-05-05 14 222021-05-06 16 232021-05-07 17 242021-05-08 14 252021-05-11 78 262021-05-12 20 272021-05-13 13 282021-05-14 8 292021-05-15 18 302021-05-16 16 312021-05-17 16 322021-05-18 18 33>>> 34>>> result = pd.merge(timestamp_df, push_start_num.reset_index(), left_on='date', right_on='index', how='left').drop('index', axis=1).fillna(0) 35>>> print(result) 36 date push1_start_date 370 2021-04-29 3.0 381 2021-04-30 20.0 392 2021-05-01 24.0 403 2021-05-02 21.0 414 2021-05-03 14.0 425 2021-05-29 0.0 436 2021-05-30 0.0 447 2021-05-31 0.0 458 2021-06-01 0.0 469 2021-05-21 0.0

投稿2021/06/02 00:38

ppaul

総合スコア24666

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

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

amaturePy

2021/06/02 09:26

ありがとうございます!お返事が遅くなりました。 2つのdfを比較して、片方で欠損箇所に値をはめる場合にouter_joinを使うのですね。 sqlのように使えるのですね。また、mergeの際にデータ型の違いでエラーが出ているので、そちらを修正次第試させて頂きます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問