簡體   English   中英

用該列的平均值替換 Pandas 數據框中的列

[英]Replace column in Pandas dataframe with the mean of that column

我有一個數據框:

df = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'B'])

   A  B
0  1  2
1  1  3
2  4  6

我想返回一個包含每列平均值的相同大小的數據框:

   A      B
0  2  3.666
1  2  3.666
2  2  3.666

有沒有一種簡單的方法可以做到這一點?

這是一個帶有assign

df.assign(**df.mean())

    A         B
0  2.0  3.666667
1  2.0  3.666667
2  2.0  3.666667

細節

使用DataFrame.mean很容易獲得DataFrame.mean

df.mean()

tenor_yrs    14.292857
rates         2.622000
dtype: float64

從上面的Series ,我們可以使用字典解包將現有列替換為結果值。 請注意,我們可以使用**Series解壓縮到字典中:

{**df.mean()}
# {'tenor_yrs': 14.292857142857143, 'rates': 2.622}

鑒於assign添加新列的方式為df.assign(a_given_column=a_value, another_column=some_other_value) ,解包使字典鍵成為函數的參數。 由於尊重原始數據幀的索引, df.assign(**df.mean())將用df.assign(**df.mean())替換數據幀的值。

您只能在 DataFrame 創建時提供一行:

pd.DataFrame(data = [df.mean()], index = df.index)

它給:

     A         B
0  2.0  3.666667
1  2.0  3.666667
2  2.0  3.666667

重新創建數據幀。 將平均值系列發送到字典,然后索引定義行數。

pd.DataFrame(df.mean().to_dict(), index=df.index)

#     A         B
#0  2.0  3.666667
#1  2.0  3.666667
#2  2.0  3.666667

相同的概念,但首先創建完整數組可以節省大量時間。

pd.DataFrame(np.broadcast_to(df.mean(), df.shape), 
             index=df.index, 
             columns=df.columns)

這里有一些時間。 當然,這將略微取決於列數,但是當您提供整個數組時,您會發現存在很大差異

import perfplot
import pandas as pd
import numpy as np

perfplot.show(
    setup=lambda N: pd.DataFrame(np.random.randint(1,100, (N, 5)),
                                 columns=[str(x) for x in range(5)]), 
    kernels=[
        lambda df: pd.DataFrame(np.broadcast_to(df.mean(), df.shape), index=df.index, columns=df.columns),
        lambda df: df.assign(**df.mean()),
        lambda df: pd.DataFrame(df.mean().to_dict(), index=df.index)
    ],
    labels=['numpy broadcast', 'assign', 'dict'],
    n_range=[2 ** k for k in range(1, 22)],
    equality_check=np.allclose,
    xlabel="Len(df)"
)

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM