Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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+中处理NA;使改变_Python_Python 3.x_Pandas - Fatal编程技术网

Python 在groupby+中处理NA;使改变

Python 在groupby+中处理NA;使改变,python,python-3.x,pandas,Python,Python 3.x,Pandas,我在转换到用于分组的列具有NaN值的组时遇到问题 以下代码在pandas版本0.19.1之前一直有效。现在,我已经将我的环境更新为版本0.20.3,它不再运行了 示例代码: import numpy import pandas df = pandas.DataFrame({'A':numpy.random.rand(100), 'B':numpy.random.rand(100)*10, 'C':nump

我在转换到用于分组的列具有NaN值的组时遇到问题

以下代码
pandas
版本0.19.1之前一直有效。现在,我已经将我的环境更新为版本0.20.3,它不再运行了

示例代码:

import numpy
import pandas
df = pandas.DataFrame({'A':numpy.random.rand(100),
                       'B':numpy.random.rand(100)*10,
                       'C':numpy.random.randint(0,10,100)})
df.loc[:9,'C']=None
df.groupby('C')['B'].transform(lambda x:x.mean())
从版本
0.20.3
开始,它会引发以下错误消息:

ValueError:长度不匹配:预期轴有90个元素,新值有100个元素

读了这本书后,我明白这是一种新的行为;不是虫子

但我不清楚如何更新我的代码,或者如何解决这个问题

我的目标是将所有(输出)值(但
C==None
的值)作为每组平均值(即
mean
)的结果。前10个“输出”值(
df.loc[:9,
)将保持不变(与“
B
”中相同)

有什么建议吗


提前感谢。

让我们用
蒙版
并用
cumsum
唯一地识别那些NaN:

new_c = df['C'].mask(df['C'].isnull(),df['C'].isnull().cumsum())
df.groupby(new_c)['B'].transform('mean')
或者,如果你测试一些更复杂的函数

df.groupby(new_c)['B'].transform(lambda x: x.mean())
输出:

Out[54]:

0     5.249441
1     4.987245
2     5.245857
3     6.450159
4     4.017234
5     4.421589
6     3.673986
7     4.746087
8     5.841651
9     5.394510
10    4.421589
11    4.421589
12    4.746087
13    4.746087
14    6.450159
15    6.450159
16    3.813816
17    5.249441
18    5.841651
19    3.813816
20    3.673986
21    4.017234
22    6.450159
23    3.673986
24    4.987245
25    5.245857
26    4.017234
27    4.017234
28    6.450159
29    4.987245
....

你仍然可以做
df.groupby('C')['B'].transform('mean')
,对吗?@JohnGalt是的。但是我应该也能使用(lambda)函数(),不是吗?谢谢你提出这个问题!对于正在学习
pandas
的人来说,这有助于理解为什么旧的答案不起作用。我不理解“唯一标识”想法。如果使用<代码> CubSoS<代码>值代替<代码>楠< /代码> s,您将生成数据的人工信息。此后的“平均”值将考虑那些(<代码> [0:9] < /代码>)。分数是有效的。这就是我得到它的原因。你能澄清这一点吗?谢谢你的帮助。是的,布兰特,因为我们不能再在组中使用null了,你需要用一些东西来替换null。如果你只是用一个值替换null,那么你的平均值将是0:9。但我的理解是,你真的y只需要那个值本身,所以我所做的是使用isnull创建并人工创建NaN组,它返回True,然后求和以获得每个NaN的唯一值。当您对这个唯一值进行分组时,它将平均该值并返回该值。@ScottBoston-
df.groupby('C')['B'].transform('mean'))
仍然可以在不需要掩蔽的情况下工作。@JohnGalt但是如果他需要使用lambda函数来处理更复杂的事情呢?嗯。我喜欢它。我必须想一想,看看它是否合适,但看起来很吸引人。对于纯随机数据,这是一个解决方案。我们将继续讨论我的问题,看看它是如何工作的。干杯。