Python Dataframe:将多索引列与单索引列组合/替换

时间:2017-12-26 05:17:19

标签: python pandas dataframe multi-index data-cleaning

我的df中有多索引列。在我的df中,所有值都是1或0表示布尔值。我的任务是用我的另一个df_test数据帧中的值替换值为'1'的值。见下文。

In [221]: df
Out[221]:
first        bar                 baz
second       one       two       one       two
0            0         1         0         0
1            1         0         1         1
2            0         0         0         1
3            0         0         0         0
4            1         1         1         1
..............(continues)

我的df_test有常规列(不是多索引)和应该进入df的值。

In [222]: df_test
Out[222]:
        amount
0            38
1            2179   
2            191     
3            4     
4            19823    
..............(continues)

两个数据帧匹配的索引和我的输出应该是:

In [223]: df
Out[223]:
first        bar                 baz
second       one       two       one       two
0            0         38        0         0
1            2179      0         2179      2179      
2            0         0         0         191     
3            0         0         0         0
4            19823     19823     19823     19823    
..............(continues)

请注意,我的df可以没有像index = 3那样的'1'值,或者像index = 4那样的所有'1'值。如果有有效的方法来设置我的数据帧

2 个答案:

答案 0 :(得分:2)

您想使用pd.DataFrame.mask并使用列amount作为替代。但是,您需要提供axis=0参数来告诉Pandas在索引上对齐。

df.mask(df.eq(1), df_test.amount, axis=0)

first     bar           baz       
second    one    two    one    two
0           0     38      0      0
1        2179      0   2179   2179
2           0      0      0    191
3           0      0      0      0
4       19823  19823  19823  19823

<强>设置

df = pd.DataFrame(
    [[0, 1, 0, 0],
     [1, 0, 1, 1],
     [0, 0, 0, 1],
     [0, 0, 0, 0],
     [1, 1, 1, 1]],
    columns=pd.MultiIndex.from_product(
        [['bar', 'baz'], ['one', 'two']],
        names=['first', 'second']
    )
)

df_test = pd.DataFrame(dict(amount=[38, 2179, 191, 4, 19823]))

答案 1 :(得分:2)

要获得结果,您可以使用广播乘法 -

v = df.values * df_test.amount.values[:, None]

v
array([[    0,    38,     0,     0],
       [ 2179,     0,  2179,  2179],
       [    0,     0,     0,   191],
       [    0,     0,     0,     0],
       [19823, 19823, 19823, 19823]])

要恢复原始数据框,只需调用DataFrame构造函数 -

即可
df = pd.DataFrame(v, columns=df.columns, index=df.index)
df

first     bar           baz       
second    one    two    one    two
0           0     38      0      0
1        2179      0   2179   2179
2           0      0      0    191
3           0      0      0      0
4       19823  19823  19823  19823

安装借鉴了piRSquared的answer