numpy 范围内列中的计数值

7gcisfzg  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(80)

我有一个pandas dataframe:
| 名称|年龄范围|
| --|--|
| 一|5-12|
| B|十二至十八|
| C|十一至十四|
| D| 7-9|
| E|十七、二十二|
我想得到一个计数列,在该列中计算整个列的年龄范围内的人数
| 年龄范围|计数|
| --|--|
| 5-12 | 2 |
| 十二至十八| 2 |
| 十一至十四| 1 |
| 7-9 | 1 |
| 十七、二十二| 1 |
编辑:较大的年龄范围必须覆盖另一个年龄范围,才能作为另一个人计入该年龄范围。
我怎样才能达到这个结果?

dxxyhpgq

dxxyhpgq1#

IIUC,这里有一个可能的选择:

from itertools import permutations

s = (df["Age range"].str.split("-").apply(
    lambda x: pd.Interval(*map(int, x), closed="both")))

d = {l:r for l,r in permutations(s, r=2) if l in r} # or l.overlaps(r) ?

out = (s.map(d).fillna(s).map(lambda x: f"{int(x.left)}-{int(x.right)}")
       .value_counts().reindex(df["Age range"], fill_value=1).reset_index())

输出量:

print(out)

  Age range  count
0      5-12      2
1     12-18      1
2     11-14      1
3       7-9      1
4     17-22      1
i2byvkas

i2byvkas2#

conditional_join提供了一种处理不等式连接的有效方法:

# pip install pyjanitor
import pandas as pd
import janitor

splitter = (df['Age range']
            .str
            .split('-',expand=True)
            .set_axis(['left','right'],axis=1)
            .astype(int)
)
out = df.assign(**splitter)
out = (out
       .conditional_join(
           out.assign(counter=1), 
           ('left', 'left', '<'), 
           ('right', 'right', '>'), 
           how = 'left', 
           df_columns = ['Name', 'Age range'],
           right_columns='counter')
      .fillna({'counter':0})
      .assign(counter = lambda f: f.counter + 1)
     )

out = out.assign(counter = out.groupby('Age range').counter.transform('sum'))

print(out)

  Name Age range  counter
0    A      5-12      2.0
1    B     12-18      1.0
2    C     11-14      1.0
3    D       7-9      1.0
4    E     17-22      1.0

相关问题