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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

pandas

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

Q&A

解決済

2回答

1691閲覧

2つのcsvを比較し計算する方法について

uguisu-21

総合スコア5

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

pandas

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

0グッド

0クリップ

投稿2021/08/30 11:33

編集2021/08/30 12:16

●やりたいこと
二つのcsvを読み込み,データの差分を計算したいと考えています。
test1またtest2の読み込みを行い、以下のようにtest3に出力したいです。

test1.csv

idnamedata1data2data3...data20
001a102020...20
002b102520...20
003c302015...40

test2.csv

idnamedata1data2data3...data20
001a202530...30
002b104030...30
003c2005...30

test3.csv

idnamedata1data2data3...data20
001a10510...10
002b01510...10
003c-10-20-10...-10

●検討した内容
・各csvをdf1,df2として格納
・df3にdf1の内容をコピー 
・df3['data1']=df2['data1']-df1['data1']
df3['data2']=df2['data2']-df1['data2'] ... のように各カラムごとに計算

python

1import pandas as pd 2df1 = pd.read_csv('test1.csv') 3df2 = pd.read_csv('test2.csv') 4 5df3 = df1 6df3['data1']=df2['data1']-df1['data1'] 7df3['data2']=df2['data2']-df1['data2'] 8. 9. 10df3['data20']=df2['data20']-df1['data20'] 11df3.to_csv('test3.csv')

●質問内容
現状の検討では、data数が増える分とても手間になります。
for文などでまとめて差分を計算できる方法はないでしょうか?
※今回のtestではdata1,data2などという名前にしていますが、実際はばらばらの名前のため、列の行数などを指定し計算できないかと考えています。

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

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

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

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

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

can110

2021/08/30 11:43

データの列数はdata1とdata2の2つだけという前提でもよいので 現状検討し実現できると思われるコードを提示ください。
uguisu-21

2021/08/30 12:01 編集

以下のように一つずつデータを読み込み、df3に置き換えていく作業です。 import pandas as pd df1 = pd.read_csv('test1.csv') df2 = pd.read_csv('test2.csv') df3 = df1 df3['data1']=df2['data1']-df1['data1'] df3['data2']=df2['data2']-df1['data2'] . . . df3.to_csv('test3.csv')
guest

回答2

0

ベストアンサー

ilocを使うのが楽でしょう。

python

1>>> print(df1) 2 id name data1 data2 data3 data20 30 1 a 10 20 20 20 41 2 b 10 25 20 20 52 3 c 30 20 15 40 6>>> print(df2) 7 id name data1 data2 data3 data20 80 1 a 20 25 30 30 91 2 b 10 40 30 30 102 3 c 20 0 5 30 11>>> df3 = df1.copy() 12>>> df3.iloc[:,2:] = df1.iloc[:,2:] - df2.iloc[:,2:] 13>>> print(df3) 14 id name data1 data2 data3 data20 150 1 a -10 -5 -10 -10 161 2 b 0 -15 -10 -10 172 3 c 10 20 10 10

投稿2021/08/31 06:09

ppaul

総合スコア24670

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

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

uguisu-21

2021/09/01 12:47

単純なコードで実現できるという点でベストアンサーとさせていただきました。 ありがとうございました。
guest

0

id列とname列以外はすべて数値」という前提で回答します。

データフレームの要素がすべて数値であれば、-を使ってそれぞれの要素の差をまとめて計算できます。今回のデータフレームでは、name列の文字列が邪魔なので、name列をいったん削除して、後で挿入すればいいでしょう。

Python

1import pandas as pd 2import io 3 4txt1 = """ 5id,name,data1,data2,data3,data20 6001,a,10,20,20,20 7002,b,10,25,20,20 8003,c,30,20,15,40 9""" 10 11txt2 = """ 12id,name,data1,data2,data3,data20 13001,a,20,25,30,30 14002,b,10,40,30,30 15003,c,20,0,5,30 16""" 17 18df1 = pd.read_csv(io.StringIO(txt1), dtype={'id': 'str'}) 19df1.set_index('id', inplace=True) 20 21df2 = pd.read_csv(io.StringIO(txt2), dtype={'id': 'str'}) 22df2.set_index('id', inplace=True) 23 24df3 = df2.drop("name", axis=1) - df1.drop("name", axis=1) 25 26df3.insert(0, "name", df1["name"]) 27print(df3)

result

1 name data1 data2 data3 data20 2id 3001 a 10 5 10 10 4002 b 0 15 10 10 5003 c -10 -20 -10 -10

投稿2021/08/30 12:17

編集2021/08/30 12:19
Daregada

総合スコア11990

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

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

uguisu-21

2021/09/01 12:48

ご回答ありがとうがございます。 "io"を使用したことがなかったため、勉強させていただきます。 ご協力ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問