這是我的困境:
我有一個這樣的資料框字典:
dict_df[key]
m1 m2 m3 m4 m5 m6
10410 5 10 21 33 11
15387 3 10 33 45 13
19026 4 16 27 40 11
26083 5 21 16 29 9
27806 4 17 23 31 7
43820 2 12 27 40 18
49199 7 22 30 38 11
50094 4 9 13 18 4
對于每個鍵,它回傳一個具有相同列名的 DF。
對于每個鍵,我需要存盤一組特征的平均值和標準差(我們以 m2、m3、m4 為例)。
最后,我想在下面獲得類似 df 的東西(數字是完全隨機的):
key m2_mean m2_std m3_mean m3_std m4_mean m4_std
key1 12 55 793 438 44 95
key2 14 442 21 43 14 442
key3 44 1 66 11 42 42
key4 42 42 2 23 98 70
資料集并沒有那么大,所以即使代碼很慢也應該沒問題。
謝謝你的幫助,祝你好運!
uj5u.com熱心網友回復:
首先,讓我們定義一些示例資料:
>>> df1 = pd.DataFrame({
"col1": [1, 2, 3],
"col2": [4, 5, 6],
})
>>> df2 = pd.DataFrame({
"col1": [7, 8, 9],
"col2": [10, 11, 12],
})
>>> dict_df = {
"df1": df1,
"df2": df2,
}
現在,您可以使用.agg()來計算資料幀的平均值和標準差(為簡單起見,我使用了 max),.stack()將資料幀減少為單個系列,并將.to_dict()此結果的表示形式生成為字串。請注意,我們將僅使用其中一個資料框 ( df1) 來顯示此結果:
>>> df1.agg(["mean", "max"]).stack().to_dict()
{('mean', 'col1'): 2.0, ('mean', 'col2'): 5.0, ('max', 'col1'): 3.0, ('max', 'col2'): 6.0}
使用這種 dict 表示,我們可以使用pd.DataFrame.from_dict構建單個資料框,其中包含每個值的指標dict_df:
>>> df = pd.DataFrame.from_dict({
df_name: df[["col1", "col2"]].agg(["mean", "max"]).stack().to_dict()
for df_name, df in dict_df.items()
}, orient="index")
>>> df
mean max
col1 col2 col1 col2
df1 2.0 5.0 3.0 6.0
df2 8.0 11.0 9.0 12.0
與預期輸出的唯一重要區別在于列名,但我們可以手動解決:
>>> df.columns = ["_".join(column) for column in df.columns]
>>> df
mean_col1 mean_col2 max_col1 max_col2
df1 2.0 5.0 3.0 6.0
df2 8.0 11.0 9.0 12.0
可以為您解決問題的代碼:
>>> target_columns = ["m2", "m3", "m4"]
>>> df = pd.DataFrame.from_dict({
key: df[target_columns].agg(["mean", "std"]).stack().to_dict()
for key, df in dict_df.items()
}, orient="index")
>>> df.columns = ["_".join(column) for column in df.columns]
>>> df.index.name = "key"
uj5u.com熱心網友回復:
首先為聚合創建一個字典,格式如下new_col_name: (dataframe_column_name, aggregare_function):
required_aggs = {f'{col_name}_{agg_name}': (col_name, agg_name)
for agg_name in ['mean', 'std']
for col_name in df}
上面給出了以下所需聚合的字典和列名。
{
'm1_mean': ('m1', 'mean'),
'm1_std': ('m1', 'std'),
'm2_mean': ('m2', 'mean'),
'm2_std': ('m2', 'std'),
'm3_mean': ('m3', 'mean'),
'm3_std': ('m3', 'std'),
'm4_mean': ('m4', 'mean'),
'm4_std': ('m4', 'std'),
'm5_mean': ('m5', 'mean'),
'm5_std': ('m5', 'std'),
'm6_mean': ('m6', 'mean'),
'm6_std': ('m6', 'std')
}
現在,對于每個資料幀,為鍵列分配鍵的值,然后按此列分組,并呼叫.agggroupby 物件傳遞上述聚合字典的解包版本:
>>> df.assign(key=123).groupby('key').agg(**required_aggs)
m1_mean m2_mean m3_mean ... m4_std m5_std m6_std
key ...
123 30228.125 4.25 14.625 ... 6.860862 8.447316 4.140393
PS:在上面的代碼片段中, df 是 中的單個資料幀dict_df[key],并且key假定它的值是123。您需要對字典中的每個資料框執行相同的操作。此外,如果您只需要計算特定列的聚合,則只需用列串列替換dfin for col_name in df,例如:for col_name in ['m1', 'm2']
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/436185.html
上一篇:根據值的位置從多列創建字典
