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,请告诉我