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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 熊猫是指groupby中的跨行和跨列_Python_Python 2.7_Pandas - Fatal编程技术网

Python 熊猫是指groupby中的跨行和跨列

Python 熊猫是指groupby中的跨行和跨列,python,python-2.7,pandas,Python,Python 2.7,Pandas,我有一个dataframe,我想在行和列之间求平均值,并按Person分组 通常我可以执行.mean()和.mean(axis=1),但是,我的数据有几个NaN值,因此此方法对具有NaN值的行应用不适当的权重 My code: import pandas as pd import numpy as np df = pd.DataFrame(data=[[1,2,np.nan, 'Person A'], [1,2,3, 'Person B'],

我有一个
dataframe
,我想在行和列之间求平均值,并按
Person
分组

通常我可以执行
.mean()
.mean(axis=1)
,但是,我的数据有几个
NaN
值,因此此方法对具有
NaN
值的行应用不适当的权重

My code:
import pandas as pd
import numpy as np
df = pd.DataFrame(data=[[1,2,np.nan, 'Person A'],
                        [1,2,3, 'Person B'],
                        [2,np.nan,5,'Person B'],
                        [4,5,7, 'Person A']],
                  columns=['A', 'B','C', 'Person'])

df = df.groupby('Person').mean()

print df.mean(axis=1)
输出:

Person
Person A    4.333333
Person B    2.500000
Person
Person A    3.8
Person B    2.6
dtype: float64
Person
Person A    3.8
Person B    2.6
Name: value, dtype: float64
          A    B    C  mean
Person                     
Person A  1  2.0  NaN   3.8
Person B  1  2.0  3.0   2.6
Person B  2  NaN  5.0   2.6
Person A  4  5.0  7.0   3.8
期望输出:

Person
Person A    3.8
Person B    2.6
输出:

Person
Person A    4.333333
Person B    2.500000
Person
Person A    3.8
Person B    2.6
dtype: float64
Person
Person A    3.8
Person B    2.6
Name: value, dtype: float64
          A    B    C  mean
Person                     
Person A  1  2.0  NaN   3.8
Person B  1  2.0  3.0   2.6
Person B  2  NaN  5.0   2.6
Person A  4  5.0  7.0   3.8

输出:

Person
Person A    4.333333
Person B    2.500000
Person
Person A    3.8
Person B    2.6
dtype: float64
Person
Person A    3.8
Person B    2.6
Name: value, dtype: float64
          A    B    C  mean
Person                     
Person A  1  2.0  NaN   3.8
Person B  1  2.0  3.0   2.6
Person B  2  NaN  5.0   2.6
Person A  4  5.0  7.0   3.8
您可以使用强制这些值为-1以取消其权重:

df.set_index('Person').stack().groupby(level=0).mean()
输出:

Person       
Person A  3.8
Person B  2.6
您还可以执行以下操作:

df = df.set_index('Person').stack().groupby(level='Person').mean().to_frame()

print(df)

            0
Person       
Person A  3.8
Person B  2.6
这里使用的是
pd.Series.to_frame
,因为此方法返回一个Series对象,并且您希望返回一个dataframe

请参阅默认情况下删除每个Nan值
DataFrame.stack(level=-1,dropna=True)[source]

级别采用int、string或这些元素的列表,默认为最后一级
级别到堆栈,可以传递级别名称。

如果要将结果保留在数据帧中,两步过程可能更有用:

df = df.set_index('Person')
df['mean'] = df.stack().groupby(level=0).mean()
输出:

Person
Person A    4.333333
Person B    2.500000
Person
Person A    3.8
Person B    2.6
dtype: float64
Person
Person A    3.8
Person B    2.6
Name: value, dtype: float64
          A    B    C  mean
Person                     
Person A  1  2.0  NaN   3.8
Person B  1  2.0  3.0   2.6
Person B  2  NaN  5.0   2.6
Person A  4  5.0  7.0   3.8

谢谢你的好建议,但我希望他们被排除在外。如果它们变为0,则会影响平均值。@user2242044 Fixed:)@Tbaki previus的答案非常接近,请允许我编辑。再加一个给这个。@Damianaltenero谢谢!我不知道这些功能,我会调查的!谢谢这很好,但在实际应用中,我遇到了一个内存错误。知道如何更有效地执行此操作吗?我得到错误:
AttributeError:'DataFrame'对象没有属性“melt”
Ah。熊猫的老版本。在Pandas.20.1中,将melt移动到dataframe methodpd.melt(df,id_vars='Person').groupby('Person')['value'].mean()…给该语句一个trystill将获得内存错误,
melt
可能更好,但两者都不能处理我需要处理的数据量。也许我可以分块做。为什么这会创建一个系列而不是一个数据帧?@user2242044根据pandas doc,de方法返回一个系列。那会影响你的结果吗?方法stack()不,没有,但我在之后尝试对其执行
DataFrame
操作,但遇到问题,但使用
pd.Series将其转换回
DataFrame
。to_frame(df)
@user2242044我更新了答案,如果知道您可以使用DataFrame,请告诉我