合并如何在熊猫中起作用

时间:2018-04-25 16:31:29

标签: python pandas merge

我发布了一个问题earlier并得到了答案。

你能解释一下加盟final_df = pd.merge(df, temp_df.reset_index(), how="left").fillna(0)是如何运作的吗?我得到了正确的结果,但我不明白连接是如何发生的。 df和temp_df之间没有公共列。

工作代码如下:

    d = {'emp': ['a',   'a',    'a',    'a',    'b',    'b',    'b',    'c',    'c',    'c',    'c' ], 
     'date': ['1',  '1',    '1',    '1',    '2',    '2',    '2',    '3',    '3',    '3',    '3' ], 
     'usd':[1,  2,  3,  4,  5,  6,  7,  8,  9,  10,     11 ], 
     'expense type':['Car Mileage',     'Car Rental',   'Car Rental - Gas',     'food',     'Car Rental',   'Car Rental - Gas',     'food',     'Car Mileage',  'Car Rental',   'food',     'wine' ],
     'zflag':['1',  '1', '1',   ' ',' ',' ',' ','2','2',' ',' ' ]
     }

    df = pd.DataFrame(data=d)



        df
    Out[253]: 
       date emp      expense type  usd zflag
    0     1   a       Car Mileage    1     1
    1     1   a        Car Rental    2     1
    2     1   a  Car Rental - Gas    3     1
    3     1   a              food    4      
    4     2   b        Car Rental    5      
    5     2   b  Car Rental - Gas    6      
    6     2   b              food    7      
    7     3   c       Car Mileage    8     2
    8     3   c        Car Rental    9     2
    9     3   c              food   10      
    10    3   c              wine   11   


temp_df = df.groupby(["emp", "date"], axis=0)["expense type"].apply(lambda x: 1 if "Car Mileage" in x.values and any([k in x.values for k in ["Car Rental", "Car Rental - Gas"]]) else 0).rename("zzflag")
temp_df = temp_df.loc[temp_df!=0,:].cumsum()
final_df = pd.merge(df, temp_df.reset_index(), how="left").fillna(0)

更新1:

temp_df没有索引,而且是一个系列。所以我不确定如何在注释中建议的连接可以发生。

temp_df
Out[335]: 
emp  date
a    1       1
c    3       2
Name: zzflag, dtype: int64

1 个答案:

答案 0 :(得分:1)

没有pd.mergeon参数的

index正在加入常见的列名称:

Per Docs in pandas API on pd.merge查看'on'参数:

  

on:标签或列表       要加入的字段名称。必须在两个DataFrame中都能找到。如果是的话       无,并且没有合并索引,然后它合并在交集上       默认情况下列

d = {'emp': ['a',   'a',    'a',    'a',    'b',    'b',    'b',    'c',    'c',    'c',    'c' ], 
     'date': ['1',  '1',    '1',    '1',    '2',    '2',    '2',    '3',    '3',    '3',    '3' ], 
     'usd':[1,  2,  3,  4,  5,  6,  7,  8,  9,  10,     11 ], 
     'expense type':['Car Mileage',     'Car Rental',   'Car Rental - Gas',     'food',     'Car Rental',   'Car Rental - Gas',     'food',     'Car Mileage',  'Car Rental',   'food',     'wine' ],
     'zflag':['1',  '1', '1',   ' ',' ',' ',' ','2','2',' ',' ' ]
     }

df = pd.DataFrame(data=d)
temp_df = df.groupby(["emp", "date"], axis=0)["expense type"].apply(lambda x: 1 if "Car Mileage" in x.values and any([k in x.values for k in ["Car Rental", "Car Rental - Gas"]]) else 0).rename("zzflag")
temp_df = temp_df.loc[temp_df!=0,:].cumsum()
a = temp_df.reset_index()

all(pd.merge(df, a) == pd.merge(df, a, on=['emp','date']))

输出:

True