我有一个如下所示的DataFrame:
data = pd.DataFrame({'id' : ['a1', 'a1', 'a1', 'a2','a2','a3','a3','a3'],
'label' : ['0','0','1','0','1','0','1','1']})
我的目标是按 id 分组并做一些算术: 计算每组中“0”和“1”的出现次数,每个数字加1000,最后将这些数字相互划分。例如,对于组'a1':'0'出现两次,'1'出现一次,然后,2 * 1000/1 * 1000 = 2.
所需的DataFrame应如下所示:
id number
a1 2
a2 1
a3 0,5
这些SO问题给了我很多帮助:
Group by two columns and count the occurrences of each combination in pandas
pandas groupby count string occurrence over column
我已尝试过不同的版本,但仍未达到所需的输出。 任何帮助都会非常适合。
答案 0 :(得分:3)
groupby
然后value_counts
,我们pct_change
data.groupby('id').label.apply(lambda x : x.value_counts(sort=False).pct_change()+1).dropna().reset_index(level=0)
Out[405]:
id label
0 a1 2.0
0 a2 1.0
0 a3 0.5
或
pd.crosstab(data.id,data.label).assign(v=lambda x : x['0']/x['1'])
Out[414]:
label 0 1 v
id
a1 2 1 2.0
a2 1 1 1.0
a3 1 2 0.5
答案 1 :(得分:2)
data.groupby('id').label.apply(lambda x: (x == '0').sum()/(x == '1').sum())
输出:
id
a1 2.0
a2 1.0
a3 0.5
Name: label, dtype: float64
答案 2 :(得分:1)
您可以使用collections.Counter
并在您的论坛中不存在1
值的情况下明确定义您需要的结果。
from collections import Counter
def calculator(x):
c = Counter(x)
try:
return c['0'] / c['1']
except ZeroDivisionError:
return np.nan
res = data.groupby('id')['label'].apply(calculator)
id
a1 2.0
a2 1.0
a3 0.5
Name: label, dtype: float64