将单级表连接到Python

时间:2018-01-12 11:02:03

标签: python pandas merge append

我有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港币 -

1 个答案:

答案 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        -