合并2个DataFrame,将数据保留在已连接的列中

时间:2018-03-13 17:27:30

标签: python pandas join merge

如何通过将索引与数组合并来向数据帧添加零行?

DF

import pandas as pd
df = pd.DataFrame(data = [[20170302, 25,0,42], 
                          [20170120, 0,89,1]], 
                       columns=['date','d1','d2','d3'])
       date  d1  d2  d3
0  20170302  25   0  42
1  20170120   0  89   1

日期数组

dates = [20170302, 20170225, 20170120]

预期输出

       date  d1  d2  d3
0  20170302  25   0  42
1  20170225   0   0   0
2  20170120   0  89   1

我尝试创建日期数据框,并合并。但是nosucess

cols = [c for c in df.columns if c not in ['date']]
df_dates = pd.DataFrame(0, dates, columns=cols)
new = pd.merge(df_dates, df,how='left', left_index=True, right_on='date')
print df_dates
          d1  d2  d3
20170302   0   0   0
20170225   0   0   0
20170120   0   0   0

但我得到了:

    d1_x    d2_x    d3_x    date    d1_y    d2_y    d3_y
0   0   0   0   20170302    25.0    0.0 42.0
1   0   0   0   20170225    NaN NaN NaN
1   0   0   0   20170120    0.0 89.0    1.0

1 个答案:

答案 0 :(得分:1)

您可以使用app添加缺少的日期:

target_*

产量

set_index/reindex/reset_index

或者,您可以使用import pandas as pd df = pd.DataFrame(data = [[20170302, 25,0,42], [20170120, 0,89,1]], columns=['date','d1','d2','d3']) dates = [20170302, 20170225, 20170120] result = df.set_index('date').reindex(dates, fill_value=0).reset_index() print(result) 并使用 date d1 d2 d3 0 20170302 25 0 42 1 20170225 0 0 0 2 20170120 0 89 1 将ZN替换为NaN:

pd.merge

请注意,fillna默认情况下会合并所有共享列。所以上面的调用合并在In [168]: pd.merge(df, pd.DataFrame({'date':dates}), how='outer').fillna(0) Out[168]: date d1 d2 d3 0 20170302 25.0 0.0 42.0 1 20170120 0.0 89.0 1.0 2 20170225 0.0 0.0 0.0 上。 pd.merge会导致datehow='outer'pd.merge中找到的每个日期的结果添加行。