Pythonの2つのDataFrameの和をとる方法について
- 評価
- クリップ 2
- VIEW 3,055
PythonでのDataFrameの操作についてです。
df1 = pd.DataFrame({'name':['A', 'B'], 'age':[20, 30], 'sex':['f', 'm']}, columns=['name', 'age', 'sex'], index=[0, 1])
df2 = pd.DataFrame({'name':['C', 'A', 'B'], 'age':[10, 10, 30], 'sex':['m', 'f', 'm']}, columns=['name', 'age', 'sex'], index=[0, 1, 2])
という2つのDataFrameがあるとき, age列の数値を足し, name列に存在しなかった名前ついては追加するという操作を行い, 以下のDataFrameを作成するにはどのようにしたら良いでしょうか。
df3 = pd.DataFrame({'name':['A', 'B', 'C'], 'age':[30, 60, 10], 'sex':['f', 'm', 'm']}, columns=['name', 'age', 'sex'], index=[0, 1, 2])
よろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
色々なやり方があるとは思いますが、df1とdf2をくっつけてからage列を足してみました。
df3 = df1.combine_first(df2)
age = (df1['age'] + df2['age']).dropna()
df3.loc[age.index, 'age'] = age
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
check解決した方法
0
自分でコードを書き解決いたしました。
ライブラリで, 以下の計算ができる場合は教えていただけると助かります。
df1 = pd.DataFrame({'name':['C', 'A', 'B'], 'age':[10, 10, 30], 'sex':['m', 'f', 'm']}, columns=['name', 'age', 'sex'], index=[0, 1, 2])
df2 = pd.DataFrame({'name':['A', 'B'], 'age':[20, 30], 'sex':['f', 'm']}, columns=['name', 'age', 'sex'], index=[0, 1])
def sum_age(df1, df2):
# df2の方が小さい場合
if len(df1['name']) > len(df2['name']):
# df1, df2に含まれていたものは合計する
# 短い方のDataFrameに合わせて, 値を合計する
for i in range(len(df1['name'])):
if df1['name'][i] in list(df2['name']):
df2['age'][list(df2['name']).index(df1['name'][i])] = df2['age'][list(df2['name']).index(df1['name'][i])] + df1['age'][i]
else:
df_temp = df1[df1.name == df1['name'][i]]
df2 = pd.concat([df2, df_temp], axis=0, ignore_index=True)
df = df2
else:
for i in range(len(df2['name'])):
# df1, df2に含まれていたものは合計する
# 短い方のDataFrameに合わせて, 値を合計する
if df2['name'][i] in list(df1['name']):
# print(list(df1['name']).index(df2['name'][i]))
# print(df1['age'][list(df1['name']).index(df2['name'][i])] + df2['age'][i])
# list(df1['name']).index(df2['name'][i]) : ここでdf1とdf2に存在しているindexをlistから抜き出してきている
df1['age'][list(df1['name']).index(df2['name'][i])] = df1['age'][list(df1['name']).index(df2['name'][i])] + df2['age'][i]
# df1に含まれていないものは, df2の行をdf1にconcatする
else:
#print(df2[df2.name == 'C'])
df_temp = df2[df2.name == df2['name'][i]]
df1 = pd.concat([df1, df_temp], axis=0, ignore_index=True)
df = df1
return df
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/01/31 16:42