1

インデックスなしで2つのパンダデータフレームをマージしようとしています:

In [127]: df1
Out[127]: 
   value1        date id    value2    group
0 -0.2284  2012-04-01  a -0.067469  group d
1 -0.4875  2012-04-01  b -0.021274  group d
2  0.1139  2012-04-01  c -0.015978  group d
3  0.3191  2012-04-01  d  0.022634  group d
4 -0.0077  2012-04-01  e  0.000000  group d

In [128]: df2
Out[128]: 
             date id      value2    group
23044  2012-04-01  a -0.06701001  group c
23045  2012-04-01  b    -0.02128  group c
23046  2012-04-01  c           0  group c
23047  2012-04-01  d           0  group c
23048  2012-04-01  e           0  group c

In [129]: pd.merge(df1, df2, how = 'outer', on = ['date', 'id', 'value2', 'group'])
Out[129]: 
   value1        date id    value2    group
0 -0.2284  2012-04-01  a -0.067469  group d
1 -0.4875  2012-04-01  b -0.021274  group d
2  0.1139  2012-04-01  c -0.015978  group d
3  0.3191  2012-04-01  d  0.022634  group d
4 -0.0077  2012-04-01  e  0.000000  group d
5     NaN  2012-04-01  a -0.067010  group c
6     NaN  2012-04-01  b -0.021280  group c
7     NaN  2012-04-01  c  0.000000  group c
8     NaN  2012-04-01  d  0.000000  group c
9     NaN  2012-04-01  e  0.000000  group c

これはほぼ望ましい出力ですが、日付と ID に従って、グループ c の value1 の NaN をグループ d の value1 で埋める必要があります。それを達成する正しい方法は何ですか?

4

1 に答える 1

0

これはやむを得ない 2 段階のプロセスだと思います。

value1 を「埋める」には、グループや値に関係なく、すべての行を同じ (日付、ID) に関連付けます。

In [5]: df3 = df2.set_index(['date', 'id']).join(
  ....:     df1.set_index(['date', 'id'])['value1']).reset_index()

最終的な結果を得るには、グループと値をひとまとめにするのではなく、すべての属性ごとに行を区別してリストします。

In [6]: pd.merge(df1, df3, how = 'outer', 
  ....:     on = ['date', 'id', 'value1', 'value2', 'group'])
Out[6]: 
   value1        date id    value2    group
0 -0.2284  2012-04-01  a -0.067469  group_d
1 -0.4875  2012-04-01  b -0.021274  group_d
2  0.1139  2012-04-01  c -0.015978  group_d
3  0.3191  2012-04-01  d  0.022634  group_d
4 -0.0077  2012-04-01  e  0.000000  group_d
5 -0.2284  2012-04-01  a -0.067010  group_c
6 -0.4875  2012-04-01  b -0.021280  group_c
7  0.1139  2012-04-01  c  0.000000  group_c
8  0.3191  2012-04-01  d  0.000000  group_c
9 -0.0077  2012-04-01  e  0.000000  group_c
于 2013-04-16T13:57:54.980 に答える