我有一个daframe,我要在其中执行多个(独立的)转换,并且它们创建一个新的数据框(具有多索引),其中每个索引都对应于其中一个转换。
更具体地说:
df = pd.DataFrame([[1, "X", 'H', 100], [2, "Y", 'K', 100] ,[3, "X", 'H', 200], [4, "Y", 'H', 100]], columns=['id', 'XY', 'HK', 'A']).set_index("id")
XY HK A
id
1 X H 100
2 Y K 100
3 X H 200
4 Y H 100
我现在想知道多少XY
和多少HK
具有相同的A
。最终结果应如下所示(具有多索引):
XY HK
X Y H K
A
100 1.0 2.0 2.0 1.0
200 1.0 NaN 1.0 NaN
这是我期望的工作:
df.groupby(['A', 'XY', 'HK']).count()
但它只包含不带值的多重索引。
我能做的是:
计算XY
:
xy_count = df.groupby(['A', 'XY']).count().HK.unstack()
计算HK
:
hk_count = df.groupby(['A', 'HK']).count().XY.unstack()
合并结果(?)
results = pd.DataFrame()
results['XY'] = xy_count
results['HK'] = hk_count
但是最后一部分现在可以使用了。
所以我的问题是:
Q1:我似乎缺少更好的方法 Q2:为什么第3步不起作用?
这不是一个真正的问题,但我也感到困惑,要获得HK,您必须致电XY列,反之亦然。
答案 0 :(得分:1)
我将首先melt
s=df.melt('A').groupby(['A','variable']).value.value_counts().unstack([1,2])
variable HK XY
value H K Y X
A
100 2.0 1.0 2.0 1.0
200 1.0 NaN NaN 1.0
答案 1 :(得分:1)
您可以这样做:
groups = df.groupby('A')
pd.concat({col:groups[col].value_counts().unstack()
for col in ['XY','HK']}, axis=1)
输出:
XY HK
X Y H K
A
100 1.0 2.0 2.0 1.0
200 1.0 NaN 1.0 NaN