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

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

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

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

pandas

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

1610閲覧

隣のセルの値と同期?関連付け?をさせたい。

yoshi1120

総合スコア1

Python

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

pandas

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/05/18 06:47

前提・実現したいこと

Pythonのデータフレーム操作に関する質問です。
データフレームAの「ID」配列の値とデータフレームBの「ID」配列の値が一致したら、データフレームBの同じ行の「受付回数」配列の値をデータフレームA「受付回数」配列に書き込む、これを最初の行から最後の行まで繰り返すプログラムを作りたいです。
そして書き込んだ値に全て+1したいです。0だったら1、4だったら5、といった感じです。
また、dfBに書いてないIDがdfAにあった場合(今回の場合はabcdなど、複数ある)は受付回数の値を+1だけしたいです。

つまり受付IDの隣に受付回数を記入して+1したいです。

前後の列は省略しました。ID列の「...」のところも数が多いため省略しました(iiii~yyyyは書いてませんがあるものとします)。また、dfAとdfBの行数は同じではなくdfAの方が多いです。

以下がサンプルと実行後の理想の表です。

dfA.csv
||利用者ID|受付回数|
|:--|:--:|
||aaaa|0|
||cccc|0|
||vvvv|0|
||xxxx|0|
||rrrr|0|
||yyyy|0|
||eeee|0|
||gggg|0|
||abcd|0|
||...|0|
||hhhh|0|

dfB.csv
||ID|受付回数|
|:--|:--:|
||aaaa|5|
||bbbb|8|
||cccc|1|
||dddd|2|
||eeee|0|
||ffff|1|
||gggg|1|
||hhhh|4|
||...|...|
||zzzz|5|

プログラム実行後のdfA.csv
||利用者ID|受付回数|
|:--|:--:|
||aaaa|6|
||cccc|2|
||vvvv|(...の値)+1|
||xxxx|(...の値)+1|
||rrrr|(...の値)+1|
||yyyy|(...の値)+1|
||eeee|1|
||gggg|2|
||abcd|1|
||...|(...の値)+1|
||hhhh|5|

該当のソースコード

Python

1import pandas as pd 2import numpy as np 3 4df=pd.read_csv("dfA.csv") 5test=pd.read_csv("dfB.csv") 6 7temp=pd.merge(df,test,left_on="利用者ID",right_on="利用者ID",how="left").drop("利用者ID", axis=1) 8df["利用回数"].where(pd.isna(temp["利用回数"]),temp["利用回数"],inplace=True) 9 10

試したこと

上記のプログラムを試したところ、「ValueError: Length of values does not match length of index」と表示されました。

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

少し返信が遅れるかもしれません。
jupyternotebookを使っていてpythonのバージョンは3.7ぐらいです。
プログラミングを始めたばかりの初心者です。どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

つまりAの全ての行に対して無条件に+1してよいと思います。
以下のような感じでできます。

Python

1import pandas as pd 2 3dfA = pd.DataFrame({'user_id':['a','b','c'], 'cnt':[0,0,0]}) 4dfB = pd.DataFrame({'id':['a','c','d'], 'cnt':[1,2,3]}) 5 6# AにBを左結合。存在しない行の値は0。 7df = dfA.merge(dfB, left_on='user_id', right_on='id', how='left', suffixes=['_x','']).fillna(0) 8sr = df['cnt'].astype(int) 9 10# Bの値を足し合わせて+1する 11dfA['cnt'] += sr + 1 12print(dfA) 13# user_id cnt 14#0 a 2 15#1 b 1 16#2 c 3

投稿2021/05/18 07:18

can110

総合スコア38278

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問