对多索引 pandas DataFrame 求和
Summing over a multiindex pandas DataFrame
假设我使用 df.set_index('Class','subclass') 创建了以下数据框,请记住有多个 Classes 与 sub类... A>Z。
Class subclass
A a
A b
A c
A d
B a
B b
我将如何计算 Class 中的子 类 并创建一个名为 no of 类 的单独列,以便我可以看到最大的 Class子数量类?我在想某种 for 循环,它贯穿 Class 字母,如果 Class 字母仍然相同,则对子类进行计数。然而,对于这样的问题,这似乎有点违反直觉。是否有更简单的方法,例如 df.groupby[].count?
所需的输出将是:
Class subclass No. of classes
A a 4
A b
A c
A d
B a 2
B b
我已经尝试了 group multi-index pandas dataframe 中显示的级别参数,但这似乎对我不起作用
编辑:
我没有提到我想要 Class 中子类 最多的一个 return。我通过以下方式实现了这一目标:
df.reset_index().groupby('Class')['subclass'].nunique().idxmax()
您可以使用 transform
将聚合计算作为新列添加回原始 df:
In [165]:
df['No. of classes'] = df.groupby('Class')['subclass'].transform('count')
df
Out[165]:
Class subclass No. of classes
0 A a 4
1 A b 4
2 A c 4
3 A d 4
4 B a 2
5 B b 2
您可以使用 transform
,但得到重复值:
df['No. of classes'] = df.groupby(level='Class')['val'].transform('size')
print (df)
val No. of classes
Class subclass
A a 1 4
b 4 4
c 5 4
d 4 4
B a 1 2
b 2 2
但如果需要空值:
df['No. of classes'] = df.groupby(level='Class')
.apply(lambda x: pd.Series( [len(x)] + [np.nan] * (len(x)-1)))
.values
print (df)
val No. of classes
Class subclass
A a 1 4.0
b 4 NaN
c 5 NaN
d 4 NaN
B a 1 2.0
b 2 NaN
获取最大数 Class
的另一个解决方案是:
df = df.groupby(level=['Class'])
.apply(lambda x: x.index.get_level_values('subclass').nunique())
.idxmax()
print (df)
A
假设我使用 df.set_index('Class','subclass') 创建了以下数据框,请记住有多个 Classes 与 sub类... A>Z。
Class subclass
A a
A b
A c
A d
B a
B b
我将如何计算 Class 中的子 类 并创建一个名为 no of 类 的单独列,以便我可以看到最大的 Class子数量类?我在想某种 for 循环,它贯穿 Class 字母,如果 Class 字母仍然相同,则对子类进行计数。然而,对于这样的问题,这似乎有点违反直觉。是否有更简单的方法,例如 df.groupby[].count?
所需的输出将是:
Class subclass No. of classes
A a 4
A b
A c
A d
B a 2
B b
我已经尝试了 group multi-index pandas dataframe 中显示的级别参数,但这似乎对我不起作用
编辑:
我没有提到我想要 Class 中子类 最多的一个 return。我通过以下方式实现了这一目标:
df.reset_index().groupby('Class')['subclass'].nunique().idxmax()
您可以使用 transform
将聚合计算作为新列添加回原始 df:
In [165]:
df['No. of classes'] = df.groupby('Class')['subclass'].transform('count')
df
Out[165]:
Class subclass No. of classes
0 A a 4
1 A b 4
2 A c 4
3 A d 4
4 B a 2
5 B b 2
您可以使用 transform
,但得到重复值:
df['No. of classes'] = df.groupby(level='Class')['val'].transform('size')
print (df)
val No. of classes
Class subclass
A a 1 4
b 4 4
c 5 4
d 4 4
B a 1 2
b 2 2
但如果需要空值:
df['No. of classes'] = df.groupby(level='Class')
.apply(lambda x: pd.Series( [len(x)] + [np.nan] * (len(x)-1)))
.values
print (df)
val No. of classes
Class subclass
A a 1 4.0
b 4 NaN
c 5 NaN
d 4 NaN
B a 1 2.0
b 2 NaN
获取最大数 Class
的另一个解决方案是:
df = df.groupby(level=['Class'])
.apply(lambda x: x.index.get_level_values('subclass').nunique())
.idxmax()
print (df)
A