我有df1这是带有费用的多级表 - 它看起来像这样(
a 60
10欧元
20澳元
30美元
b 65
40欧元
10英镑
15港元
这两个都是使用这个脚本完成的
t_sub=pd.concat([
t.assign(
**{x: '' for x in ['Client'][i:]}
).groupby(list(['Client'])).sum() for i in range(1,2)
]).sort_index()
然后我有另一张桌子,里面有每个人的钱 - df2
a - 100
b - 200
我想将第二个表附加到第一个表,但它必须匹配客户总数的级别,例如。
60 100
10欧元 -
20澳元 -
30美元 -
b 65 200
40欧元 -
10英镑 -
15港币 -
答案 0 :(得分:0)
如果没有数据示例,很难确切知道需要做些什么,但这是一个可能的解决方案。它不是太优雅,但希望它会让你开始并让你有可能获得你想要的东西。
首先,让我们创建两个数据帧:
import pandas as pd
df1 = pd.DataFrame({'Expenses': [60, 10, 20, 30, 65, 40, 10, 15]},
index=pd.MultiIndex(levels=[['a', 'b'],
['', 'EUR', 'AUD', 'USD', 'GBP', 'HKD']],
labels=[[0, 0, 0, 0, 1, 1, 1, 1], [0, 1, 2, 3, 0, 1, 4, 5]],
names=['Person', 'Currency']))
df1
# Expenses
# Person Currency
# a 60
# EUR 10
# AUD 20
# USD 30
# b 65
# EUR 40
# GBP 10
# HKD 15
df2 = pd.DataFrame({'Money': [100, 200]}, index=pd.Index(['a', 'b'], name='Person'))
df2
# Money
# Person
# a 100
# b 200
现在我们可以通过索引合并数据帧。请注意,我为两个数据帧中的Person
索引指定了相同的名称。如果您没有这样做,则可能需要在name
中为索引提供df2
:
new_df = pd.merge(df1, df2, left_index=True, right_index=True)
由于Money
中的df2
值被复制到同一个人的所有行,因此无法获得您想要的内容:
new_df
# Expenses Money
# Person Currency
# a 60 100
# EUR 10 100
# AUD 20 100
# USD 30 100
# b 65 200
# EUR 40 200
# GBP 10 200
# HKD 15 200
所以,即使hacky,你也可以找到那些不应该有值的行(那些没有Currency
值的行),并用你想要的任何内容替换Money
(我简短地说出你在问题中所说的内容)。
我分两步完成。首先,我选择Currency
中没有值的所有行:
no_change = new_df.loc[(slice(None), slice('')), :]
然后,在new_df
数据框中,我选择所有其他行(需要更改的行),然后修改Money
中的值:
new_df.loc[~new_df.index.isin(no_change.index), 'Money'] = '-'
这可以为您提供您正在寻找的内容:
new_df
# Expenses Money
# Person Currency
# a 60 100
# EUR 10 -
# AUD 20 -
# USD 30 -
# b 65 200
# EUR 40 -
# GBP 10 -
# HKD 15 -