我的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'值。如果有有效的方法来设置我的数据帧
要获得结果,您可以使用广播乘法 -
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感谢。
您想使用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]))