大熊猫算过多个列
问题描述:
我有一个数据帧寻找这样大熊猫算过多个列
Measure1 Measure2 Measure3 ...
0 1 3
1 3 2
3 0
我想在列数的值的出现,产生:
Measure Count Percentage
0 2 0.25
1 2 0.25
2 1 0.125
3 3 0.373
随着
outcome_measure_count = cdss_data.groupby(key_columns=['Measure1'],operations={'count': agg.COUNT()}).sort('count', ascending=True)
我只得到第一列(实际上使用graphlab包,但我更喜欢大熊猫)
有人可以帮我吗?
答
您可以通过扁平化利用ravel
和value_counts
东风,从这里就可以构成最终的DF产生计数:
In [230]:
import io
import pandas as pd
t="""Measure1 Measure2 Measure3
0 1 3
1 3 2
3 0 0"""
df = pd.read_csv(io.StringIO(t), sep='\s+')
df
Out[230]:
Measure1 Measure2 Measure3
0 0 1 3
1 1 3 2
2 3 0 0
In [240]:
count = pd.Series(df.squeeze().values.ravel()).value_counts()
pd.DataFrame({'Measure': count.index, 'Count':count.values, 'Percentage':(count/count.sum()).values})
Out[240]:
Count Measure Percentage
0 3 3 0.333333
1 3 0 0.333333
2 2 1 0.222222
3 1 2 0.111111
我插入了0
只是为了让DF形状正确的,但你应该得到的点
答
In [68]: df=DataFrame({'m1':[0,1,3], 'm2':[1,3,0], 'm3':[3,2, np.nan]})
In [69]: df
Out[69]:
m1 m2 m3
0 0 1 3.0
1 1 3 2.0
2 3 0 NaN
In [70]: df=df.apply(Series.value_counts).sum(1).to_frame(name='Count')
In [71]: df
Out[71]:
Count
0.0 2.0
1.0 2.0
2.0 1.0
3.0 3.0
In [72]: df.index.name='Measure'
In [73]: df
Out[73]:
Count
Measure
0.0 2.0
1.0 2.0
2.0 1.0
3.0 3.0
In [74]: df['Percentage']=df.Count.div(df.Count.sum())
In [75]: df
Out[75]:
Count Percentage
Measure
0.0 2.0 0.250
1.0 2.0 0.250
2.0 1.0 0.125
3.0 3.0 0.375
而当这部分是一个更大的df的一部分?所以我需要指定列?当使用:count = pd.Series(cdss_data ['measure1','measure2']。squeeze()。values.ravel())。value_counts()我得到一个错误(cdss_data是我的df) – dsent
您需要双下标'count = pd.Series(cdss_data [['measure1','measure2']]。squeeze()。values.ravel())。value_count s()' – EdChum
太棒了!有没有办法强制行的顺序和顺序? – dsent