合并数据框中的重复列

时间:2018-01-06 20:53:32

标签: python pandas dataframe

我正在尝试从一组系列中获取一个新的数据帧(我将原始数据帧设置为空白DF)。这是我必须获得该系列的代码。

all_keys = list(dict_months.keys())
for i in all_keys:
    for j in range(len(dict_months[i])):
        temp_num = df_mth_return.loc['1992-'+str(i),dict_months[i][j]]
        blank_df = blank_df.append(temp_num) # append Series to blank_df

以下是结果序列的示例输出,每个temp_num都是一个pandas Series

Date 
1992-02-03   -2.174845
Name: IBM US Equity, dtype: float64 
Date 
1992-02-03    0.878127
Name: MMM US Equity, dtype: float64
Date
1992-03-02   -3.884848
Name: IBM US Equity, dtype: float64

这是我得到的结果

en          IBM US Equity   MMM US Equity   IBM US Equity   MMM US Equity   IBM US Equity   IBM US Equity   
2/3/1992    -2.17485        0.878127          NaN          all the way across  >> NaN
3/2/1992        NaN             NaN         -3.88485          -2.47076       NaN    acorss >> 
1/2/1992        NaN             NaN            NaN               NaN         1.123077   NaN across >>>> 
7/1/1992        NaN             NaN            NaN               NaN               NaN  -3.19279    3.091772    NaN across >>>> 
4/1/1992  ETC.... DOWN 

但我希望最终的数据框看起来如下所示,以便相同的列只显示一次。有人可以帮忙吗?这是blank_DF的一个小样本,它继续用于多列和更多行。

           IBM US Equity    MMM US Equity
2/3/1992    -2.17485         0.878127
3/2/1992    -3.88485         -2.47076
1/2/1992    1.123077           NaN
7/1/1992    -3.19279         3.091772
4/1/1992      NaN             5.63469
5/1/1992    1.312976         2.867628

1 个答案:

答案 0 :(得分:1)

我认为您需要按列groupby并使用bfill应用lambda函数,以便NaNiloc填充第一列:

df = df.groupby(axis=1, level=0).apply(lambda x: x.bfill(axis=1).iloc[:, 0])
print (df)
          IBM US Equity  MMM US Equity
en                                    
2/3/1992      -2.174850       0.878127
3/2/1992      -3.884850      -2.470760
1/2/1992       1.123077            NaN
7/1/1992      -3.192790       3.091772

使用numpy和完美的Divakar函数justify的另一个解决方案 - 仅在[:, 0]中选择第二个数组中的第一个值:

f = lambda x: pd.Series(justify(x.values, invalid_val=np.nan, axis=1, side='left')[:, 0])
df = df.groupby(axis=1, level=0).apply(f)
print (df)