我有一个DataFrame作为
sizeof(int)
我必须用组的均值替换y列。我可以使用此代码在一个列中进行分组。
ptr
我正在尝试通过“ Page”和“ Line”的组替换y的值。像这样的东西
Page Line y
1 2 3.2
1 2 6.1
1 3 7.1
2 4 8.5
2 4 9.1
我在该网站上搜索了很多答案,但找不到此应用程序。将python3与pandas一起使用。
答案 0 :(得分:4)
您需要列名列表,groupby
参数by
:
依据:映射,功能,标签或标签列表
用于确定分组依据的分组。如果by是函数,则会在对象索引的每个值上调用它。如果传递了dict或Series,则将使用Series或dict VALUES来确定组(将Series的值首先对齐;请参见.align()方法)。如果传递了ndarray,则按原样使用这些值来确定组。标签或标签列表可以按自身中的列传递给分组。注意,元组被解释为(单个)键。
df['y'] = df.groupby(['Page', 'Line'])['y'].transform('mean')
print (df)
Page Line y
0 1 2 4.65
1 1 2 4.65
2 1 3 7.10
3 2 4 8.80
4 2 4 8.80
您的解决方案应更改为这种语法糖-通过列表中的系列:
df['y'] = df['y'].groupby([df['Page'], df['Line']]).transform('mean')
答案 1 :(得分:2)
所以你想要这个:
df['y'] = df.groupby(['Page', 'Line']).transform('mean')
答案 2 :(得分:2)
@jezrael's approach是习惯用法。使用这种方法!
np.bincount
和pd.factorize
这应该很快。但是,这是针对特定问题的专门解决方案,如果要一概而论,效果不好。另外,如果您需要处理np.nan
,则必须采用更多的逻辑。
f, u = pd.factorize(list(zip(df.Page, df.Line)))
df.assign(y=(np.bincount(f, df.y) / np.bincount(f))[f])
Page Line y
0 1 2 4.65
1 1 2 4.65
2 1 3 7.10
3 2 4 8.80
4 2 4 8.80
这是在做什么:
pd.factorize
标识组np.bincount(f)
正在计算每个组中有多少项np.bincount(f, df.y)
对每个组中的列y
的值求和(np.bincount(f, df.y) / np.bincount(f))
找到平均值(np.bincount(f, df.y) / np.bincount(f))[f]
切片呈现与原始数组相同的长度set_index
和map
这是我的愚蠢。不要使用这个。
cols = ['Page', 'Line']
df.assign(y=df.set_index(cols).index.map(df.groupby(cols).y.mean()))
Page Line y
0 1 2 4.65
1 1 2 4.65
2 1 3 7.10
3 2 4 8.80
4 2 4 8.80
groupby
(不使用transform
)来获取tuple
-> mean
set_index
作为使熊猫产生元组的便捷方法Index
对象具有一种map
方法,因此我们将使用该方法