[英]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.