我試圖找到一種方法在兩個單獨的熊貓資料框中的相同列之間應用自定義函式,以獲得新的資料框。
所以,我有 2 個這樣的資料框:
import pandas as pd
df1 = pd.DataFrame({'num':['NUM1','NUM2','NUM3','NUM4','NUM5'],'mean':[3,4,6,8,2],'count':[2,2,1,4,5]})
df2 = pd.DataFrame({'num':['NUM1','NUM4','NUM5','NUM6','NUM7'],'mean':[4,2,2,5,1],'count':[2,3,1,1,1]})
df1
num mean count
0 NUM1 3 2
1 NUM2 4 2
2 NUM3 6 1
3 NUM4 8 4
4 NUM5 2 5
df2
num mean count
0 NUM1 4 2
1 NUM4 2 3
2 NUM5 2 1
3 NUM6 5 1
4 NUM7 1 1
我還有一個自定義函式可以更新兩個單獨樣本的平均值:
def mean_updater(mean1,n1,mean2,n2):
return round(((mean1*n1) (mean2*n2))/(n1 n2),2)
還有一個更新計數的函式:
def count_updater(n1,n2):
return n1 n2
我想要實作的是一個新的 df,其中包含匹配記錄的更新均值和計數(存在于兩個 dfs 中),兩個 dfs 中都不存在的記錄附加沒有任何更改。
所以,結果應該是:
新的_df
num mean count
0 NUM1 3.5 4
1 NUM2 4 2
2 NUM3 6 1
3 NUM4 5.43 7
4 NUM5 2 6
5 NUM6 5 1
6 NUM7 1 1
uj5u.com熱心網友回復:
不是最好的解決方案,但可能適用于您的用例:
# merge the data
common = pd.merge(df1, df2, on="num", how="outer")
common["mean"] = common[["mean_x", "mean_y"]].mean(axis=1)
common["count"] = common[["count_x", "count_y"]].sum(axis=1)
common[["num", "mean", "count"]]
uj5u.com熱心網友回復:
您可以將列傳遞給您的函式,然后將它們加入concat并最后用原始df11和替換缺失值df22:
#changed to np.round for working with arrays
def mean_updater(mean1,n1,mean2,n2):
return np.round(((mean1*n1) (mean2*n2))/(n1 n2),2)
def count_updater(n1,n2):
return n1 n2
#for match by num columns
df11 = df1.set_index('num')
df22 = df2.set_index('num')
s1 = mean_updater(df11['mean'], df11['count'], df22['mean'], df22['count'])
s2 = count_updater(df11['count'], df22['count'])
df = (pd.concat([s1.rename('mean'), s2], axis=1)
.fillna(df11)
.fillna(df22)
.reset_index())
print (df)
num mean count
0 NUM1 3.50 4.0
1 NUM2 4.00 2.0
2 NUM3 6.00 1.0
3 NUM4 5.43 7.0
4 NUM5 2.00 6.0
5 NUM6 5.00 1.0
6 NUM7 1.00 1.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/409846.html
標籤:
上一篇:回圈總和不包括一列熊貓資料框
下一篇:PandasDF到嵌套串列
