合并列值不同的不同数据框

时间:2019-12-17 06:36:55

标签: python pandas numpy dataframe

我是python and pandas的新手。现在,在这里,我具有来自三个不同数据框列的value_counts,已使用以下内容将其转换为数据框,

df1 = pd.DataFrame()
df1 = first_count.rename_axis('PredictedFeature').reset_index(name='counts') ,In the same way I got three dataframes ,



  df1 = 

       predictedFeature              counts
          100                          100
          200                          300
          2200                         150
            0                           11
          10                            15      
dF2 = 

   predictedFeature                counts
       100                           200
       200                           310
       2100                         150
       2200                          123
       160                            4     
        0                            100

df3 =

   predictedFeature                  counts
       100                           112
       200                           190
       3600                           89
       156                             2
       2200                          180
         0                            10 

现在,为了合并这些数据框,我尝试了

df_final = [df1, df2, df3]
df_final_percentage = reduce(lambda left, right: pd.merge(left, right, on='PredictedFeature'), df_final)   

完成此操作后,它会创建数据帧,但仅使用常见的预测特征值。

所以,我得到的最终数据帧是,

predictedFeature    counts_x    counts_y    counts
    100                  100        200        112
    200                  300        310       190
   2200                  150       123        180   

我如何从这三个值中获取所有值,如果一个数据帧不存在ForecastFeature,则该位置应为0。

输出就像,

PredictedFeature        counts_x       counts_y      counts
  100                    100              200          112  
  200                    300              310          190    
  2200                   150              123          180        
  2100                    0               150           0
  160                     0                4            0 
  3600                    0                0            89    
  156                     0                0             2 

有人可以帮我吗?

一件事是,在分割

的同时
df["counts_y"] = df["counts_y"] * 100 / df["counts_x"]
df["counts_per"] = df["counts"] * 100 / df["counts_x"]

值中的0是否会影响百分比计算?

enter image description here

cols = ["PredictedFeature", "counts_per", "counts_y"]
    df_percentage.to_csv('data.csv', columns=cols) 

用于创建csv百分比。

1 个答案:

答案 0 :(得分:0)

我认为您可以使用outer联接将缺失的值替换为0

df_final = [df1, df2, df3]
df_final_percentage = (reduce(lambda left, right: pd.merge(left, 
                                                          right, 
                                                          on='predictedFeature', 
                                                          how='outer'), df_final)
                      .fillna(0)
                      .astype(int))
print (df_final_percentage)
   predictedFeature  counts_x  counts_y  counts
0               100       100       200     112
1               200       300       310     190
2              2200       150       123     180
3              2100         0       150       0
4               160         0         4       0
5              3600         0         0      89
6               156         0         0       2

使用concat的另一种解决方案:

dfs = [x.set_index('predictedFeature') for x in df_final]
df_final_percentage = pd.concat(dfs, axis=1).fillna(0).reset_index().astype(int)
print (df_final_percentage)
   predictedFeature  counts  counts  counts
0               100     100     200     112
1               156       0       0       2
2               160       0       4       0
3               200     300     310     190
4              2100       0     150       0
5              2200     150     123     180
6              3600       0       0      89

EDIT1:

要过滤出010值,请使用:

df_final = [df1, df2, df3]
df_final = [x[~x['predictedFeature'].isin([0,10])] for x in df_final]
df_final_percentage = (reduce(lambda left, right: pd.merge(left, 
                                                          right, 
                                                          on='predictedFeature', 
                                                          how='outer'), df_final)
                      .fillna(0)
                      .astype(int))
print (df_final_percentage)
   predictedFeature  counts_x  counts_y  counts
0               100       100       200     112
1               200       300       310     190
2              2200       150       123     180
3              2100         0       150       0
4               160         0         4       0
5              3600         0         0      89
6               156         0         0       2