我是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是否会影响百分比计算?
cols = ["PredictedFeature", "counts_per", "counts_y"]
df_percentage.to_csv('data.csv', columns=cols)
用于创建csv百分比。
答案 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:
要过滤出0
和10
值,请使用:
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