Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.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 - Fatal编程技术网

Python 大熊猫群居不好

Python 大熊猫群居不好,python,pandas,Python,Pandas,有没有办法强制pandas.groupby返回数据帧?下面是一个例子来说明我的问题: 玩具数据框: df = pd.DataFrame(data=dict(a=[1, 1, 1, 2, 2, 2, 3, 3, 3], b=[1, 1, 1, 2, 2, 2, 4, 4, 4]) 此函数按预期返回数据帧: def fcn_good(d): return pd.Series(data=dict(mean=d.b.mean(), st

有没有办法强制pandas.groupby返回数据帧?下面是一个例子来说明我的问题:

玩具数据框:

df = pd.DataFrame(data=dict(a=[1, 1, 1, 2, 2, 2, 3, 3, 3], 
                            b=[1, 1, 1, 2, 2, 2, 4, 4, 4])
此函数按预期返回数据帧:

def fcn_good(d):
    return pd.Series(data=dict(mean=d.b.mean(), std=d.b.std()))
print(df.groupby('a').apply(fcn_good))
有输出

   mean  std
a
1   1.0  0.0
2   2.0  0.0
3   4.0  0.0
现在问题来了。在我的实际代码中,一些groupby键在计算过程中会失败。我想要的输出是:

   mean  std
a
1   1.0  0.0
2   NaN  NaN
3   4.0  0.0
但是,此代码

def fcn_bad(d):
    if int(d.a.unique()[0]) == 2: # Simulate failure
        return pd.Series()
    return pd.Series(data=dict(mean=d.b.mean(), std=d.b.std()))
print(df.groupby('a').apply(fcn_bad))
而是返回一个序列:

a
1  mean    1.0
   std     0.0
3  mean    4.0
   std     0.0
dtype: float64
有人知道如何让它工作吗

您可以使用列
a
的值和,因为是按列
a

def fcn_bad(d):
    if int(d.a.unique()[0]) == 2: # Simulate failure
        return pd.Series()
    return pd.Series(data=dict(mean=d.b.mean(), std=d.b.std()))
print(df.groupby('a').apply(fcn_bad).unstack().reindex(df.a.unique()))
   mean  std
a           
1   1.0  0.0
2   NaN  NaN
3   4.0  0.0

如果将列名称为final
df
index
添加到
Series
中,如
pd.Series(index=['mean','std'])
,则返回
DataFrame

def fcn_bad(d):
    if int(d.a.unique()[0]) == 2: # Simulate failure
        return pd.Series(index=['mean','std'])
    return pd.Series(data=dict(mean=d.b.mean(), std=d.b.std()))
print(df.groupby('a').apply(fcn_bad))
   mean  std
a           
1   1.0  0.0
2   NaN  NaN
3   4.0  0.0