我有一个看起来像这样的数据框:
>>> df = pd.DataFrame( {'level01': [10, 20, 20, 30, 40, 50, 60], 'level02': [110, 210, 150, 310, 410, 510, 610], 'value01': [1, 0, 0, 2, 0, 0, 3], 'value02': [0, 3, 0, 1, 0, 0, 1]} )
>>> df
level01 level02 value01 value02
0 10 110 1 0
1 20 210 0 3
2 20 150 0 0
3 30 310 2 1
4 40 410 0 0
5 50 510 0 0
6 60 610 3 1
每个值列对应于其级别列。例如,df['value01'][0]
为1,表示级别df['level01'][0]
的值为10。(级别10的值为1)
我想提取级别为 0 的每个值行,并创建数据透视表。因此,结果将是:
level, value
0 20 2
1 40 1
2 50 1
3 110 1
4 150 1
5 410 1
6 510 1
我尝试了df.pivot_table( values=df[['value01', 'value02']], index=df[['level01', 'level02']], aggfunc='count')
,但结果与我的想法完全不同。
value01 value02
level01 level02
10 110 1 1
20 150 1 1
210 1 1
30 310 1 1
40 410 1 1
50 510 1 1
60 610 1 1
如何获得所需的结果?如果能对此有所帮助,我将不胜感激。
答案 0 :(得分:1)
在列中创建SELECT c.delivery_id,
COUNT(c.carton_id) AS count_of_carton,
COUNT(ds.carton_id) AS count_of_deliveries_shipped
FROM carton AS c
LEFT JOIN deliveries_shipped AS ds
ON c.delivery_id = ds.delivery_id AND c.carton_id <> ds.carton_id
GROUP BY c.delivery_id;
,通过stack
进行整形,因此可以通过query
仅过滤MultiIndex
值,最后通过GroupBy.size
过滤每组的计数:< / p>
0
如果只有s = df.columns.to_series()
df.columns = pd.MultiIndex.from_arrays(list(zip(*s.str.extract('(\D+)(\d+)').values.tolist())))
df2 = (df.stack()
.query('value == 0')
.groupby('level')
.size()
.reset_index(name='value'))
print (df2)
level value
0 20 2
1 40 1
2 50 1
3 110 1
4 150 1
5 410 1
6 510 1
列是第一步中用numpy.ravel
创建助手2
的解决方案:
DataFrame