Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有一个智能的解决方案通过函数转换数据帧并将结果设置到每个单元格?_Python_Pandas_Dataframe - Fatal编程技术网

Python 是否有一个智能的解决方案通过函数转换数据帧并将结果设置到每个单元格?

Python 是否有一个智能的解决方案通过函数转换数据帧并将结果设置到每个单元格?,python,pandas,dataframe,Python,Pandas,Dataframe,下面是一个例子: 输入: 1 2 3 4 5 6 输出: 2.5 3.5 4.5 2.5 3.5 4.5 在这里,我想获得每列的平均值,并将结果设置为列中的每个单元格。 如果我使用loop,我可以完成这项工作。我觉得太难看了。 我尝试使用apply,但无法获取函数中的列信息 有什么聪明的解决方案吗?这种黑客技术应该有效,但我觉得应该有更好的解决方案(意思是根本没有黑客技术) 这不太俗气,但仍然很难看 df.stack().groupby(level=1).transform(

下面是一个例子:

输入:

1  2  3 
4  5  6 
输出:

2.5 3.5 4.5 
2.5 3.5 4.5 
在这里,我想获得每列的
平均值
,并将结果设置为列中的每个单元格。
如果我使用loop,我可以完成这项工作。我觉得太难看了。
我尝试使用apply,但无法获取函数中的列信息


有什么聪明的解决方案吗?

这种黑客技术应该有效,但我觉得应该有更好的解决方案(意思是根本没有黑客技术)


这不太俗气,但仍然很难看

df.stack().groupby(level=1).transform(lambda x: x.mean()).unstack()
IMO循环解决方案(如果它仍然是矢量化解决方案)并不总是邪恶的

为了公平起见,所有解决方案将使用原始DF的副本:

In [32]: %paste
def not_so_ugly(df):
    x = df.copy()
    for col in x.columns:
        x[col] = x[col].mean()
    return x

def apply_mean(df):
    x = df.copy()
    return x.apply(lambda c: np.repeat(c.mean(), len(x)))


def stack_groupby(df):
    x = df.copy()
    return x.stack().groupby(level=1).transform(lambda x: x.mean()).unstack()

def concat_transpose(df):
    x = df.copy()
    new_df = pd.concat([x.mean()]*len(x),axis=1).T
    new_df.index = x.index
    return new_df

## -- End pasted text --
时间:

In [37]: df = pd.DataFrame(np.random.randint(0, 10**7, size=(10**5, 3)), columns=list('abc'))

In [38]: %timeit concat_transpose(df)
1 loop, best of 3: 1.66 s per loop

In [39]: %timeit stack_groupby(df)
10 loops, best of 3: 153 ms per loop

In [40]: %timeit apply_mean(df)
100 loops, best of 3: 6.65 ms per loop

In [41]: %timeit not_so_ugly(df)
100 loops, best of 3: 5.1 ms per loop

一个简洁的方法是
df.loc[:]=df.mean().values
@ajcr,这是一个非常好的解决方案,但是你知道为什么如果我第二次尝试这样做(即,字面上运行
df.loc[:]=df.mean().values
两次),我得到
值错误:无法使用长度不同于值的切片索引器设置吗,这是一个奇怪的错误。我不认为以这种方式再次修改框架会导致问题。我还需要进一步研究回溯。似乎
df.loc[:,:]=df.mean()。值可以重复,所以如果您不明确,熊猫会以某种方式混淆行/列。@ajcr,谢谢!如果多次执行
df.loc[:]=df.mean().values
的话,这确实是一个有点出乎意料的行为,尽管我已经尝试了你的apply_mean()。但我想这本书只是为了测试。“我的理解是对的?”钱德勒宋,是的。您需要
df.apply(lambda c:np.repeat(c.mean(),len(df))
,但请注意ajcr提供的
df.loc[:,:]=df.mean().values
解决方案-我认为这是最好的解决方案…我认为apply解决方案也更好。我测试性能,应用更好,比ajcr快2毫秒。而ajcr解决方案,如果我想保留orgin数据,副本是必须的。我想对于大数据来说,性能会差得多。但他的解决方案非常简洁。
In [37]: df = pd.DataFrame(np.random.randint(0, 10**7, size=(10**5, 3)), columns=list('abc'))

In [38]: %timeit concat_transpose(df)
1 loop, best of 3: 1.66 s per loop

In [39]: %timeit stack_groupby(df)
10 loops, best of 3: 153 ms per loop

In [40]: %timeit apply_mean(df)
100 loops, best of 3: 6.65 ms per loop

In [41]: %timeit not_so_ugly(df)
100 loops, best of 3: 5.1 ms per loop